运用Json.NET来系列化所需的数码

我们在做开发的时候,很多时候须要和Json数据格式打交道,如Web开发里面,很多时候,数据经过Json举办传递到页面上,然后在开展拍卖的。而选用Json的时候,大家不少时候会涉及到多少个序列化对象的应用:DataContractJsonSerializer,JavaScriptSerializer
和[
Json.NET**](http://james.newtonking.com/json)。大多数人都会选择性能以及通用性较好Json.NET,这个不是微软的类库,但是一个开源的世界级的Json操作类库,从下面的性能对比就可以看到它的其中之一的性能优点。

Ajax 1

Json.NET能很好系列化或者反体系化.NET的各体系型数据,而且它的另一个独到之处,是可以配备Attribute属性,指定输出的属性的称谓或者是还是不是输出,那点自己格外喜爱。

JSON(JavaScript Object
Notation,JavaScript对象表示法)是一种轻量级的数据互换格式。JSON是“名值对”的聚合。结构由大括号'{}’,中括号'[]’,逗号’,’,冒号’:’,双引号’“”’组成,包括的数据类型有Object,Number,Boolean,String,Array,
NULL等。

1、在Web中使用Json数据

 在自我的根据MVC+EasyUI的Web开发框架中,Web界面层多量运用了Ajax方式得到所需数据,然后绑定到树列表控件或者其余界面控件里面,在前面的片段Web框架随笔体系内部,我介绍过众多Json格式的操作。

1)按照MVC4+EasyUI的Web开发框架经验总计(3)-
使用Json实体类营造菜单数据

2)依照MVC4+EasyUI的Web开发框架经验总计(2)-
使用EasyUI的树控件打造Web界面

如在MVC的视图里面,通过Web请求的Json数据后起始化树控件的代码如下所示

    //初始化组织机构列表
    function initDeptTreeview() {
        $("#loading").show();

        $('#treeDept').tree({
            url: '/User/GetMyDeptTreeJson?userId=@Session["UserId"]',
            onClick: function (node) {
                loadDataByOu(node.id);
            }
          });

        $("#loading").fadeOut(500);
    }

如故用户角色的起始化界面代码

                $('#lbxRoles').empty();
                $.getJSON("/Role/GetRolesByUser?r=" + Math.random() + "&userid=" + info.ID, function (json) {
                    $.each(json, function (i, item) {
                        $('#lbxRoles').append('<option value="' + item.ID + '">' + item.Name + '</option>');
                    });
                });

Ajax, 

眼前说过,Json.NET具有属性配置效益,可以指定某个属性是或不是输出,或者输出的称号转义等。默许情状下,Json.Net体系化后结果中的字段名称和类中属性的称谓一致,倘诺想自定义序列化后的字段名称,可以应用JsonProperty。

俺们清楚,EasyUI的Tree控件里面,它的数量格式,除了一个id和text是必须的之外,它的很多属性是可选的,也就是说在Json里面,可以不出口某个属性的始末。这几个通过布置

[JsonProperty( NullValueHandling = NullValueHandling.Ignore)]

就足以忽略某个属性的输出了,假诺这么些特性的值为null的话。

树控件的数据还有一个checked属性,
若是没有转义效能,大家须要指定属性为checked,
而checked是C#个中的保留紧要字,不可能使用,那么就不能了。而Json.NET提供了转义成效的安插Attribute,很好解决难题,如下所示。

        [JsonProperty(PropertyName = "checked", NullValueHandling = NullValueHandling.Ignore)]
        public bool? Checked { get; set; }

故此所有EasyUI的Tree数据对象消息,在C#其间可以定义为如下所示(那里可以忽略DataContract、DataMember的概念)。

    /// <summary>
    /// 定义EasyUI树的相关数据,方便控制器生成Json数据进行传递
    /// </summary>
    [DataContract]
    [Serializable]
    public class EasyTreeData
    {
        /// <summary>
        /// ID
        /// </summary>
        [DataMember]
        public string id { get; set; }

        /// <summary>
        /// 节点名称
        /// </summary>
        [DataMember]
        public string text { get; set; }

        /// <summary>
        /// 是否展开
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        [DataMember]
        public string state  { get; set; }

        /// <summary>
        /// 图标样式
        /// </summary>
        [DataMember]
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string iconCls { get; set; }


        [JsonProperty(PropertyName = "checked", NullValueHandling = NullValueHandling.Ignore)]
        [DataMember(Name="checked")]
        public bool? Checked { get; set; }


        /// <summary>
        /// 子节点集合
        /// </summary>
        [DataMember]
        public List<EasyTreeData> children { get; set; }

拔取上的实体类,并运用Json.NET来连串化我们的数额,我们恐怕获取下边的Json数据。

[
 {
    id: "-1",
    text: "无",
    state: "open",
    checked: true,
    children: [ ] 
 },
 {
    id: "6",
    text: "总经办",
    state: "open",
    iconCls: "icon-group",
    children: [ ]
 }
]

大家从地点的Json数据可以见到,Checked属性顺遂转移为checked的称号属性,标记为[JsonProperty(NullValueHandling

NullValueHandling.Ignore)] ,而值为null的特性,将不会油可是生在Json的字符串里面了。

其一在某种意况下,正好就是我们所急需的。 

2、在微信接口开发中动用Json

微信API的接口,大批量利用了Json数据,不仅广大回到的数额是运用Json表明,而且其Post的多少,也多数运用Json数据格式,如在本人的前两篇随笔《C#开发微信门户及运用(5)–用户分组新闻保管》 、《C#付出微信门户及利用(4)–关怀用户列表及详细新闻管理

内部介绍的情节,微信的累累接口都选择了Json数据。

如重返关注者列表的Json数据,就是之类所示。

{"total":2,"count":2,"data":{"openid":["","OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}

创建用户分组,重返的多寡格式如下,同样也是Json数据。

{
    "group": {
        "id": 107, 
        "name": "test"
    }
}

通过上边基于Json.NET的Json数据的变换,就可以顺利从Json字符串转换为对应的实业对象了。

    /// <summary>
    /// Json字符串操作辅助类
    /// </summary>
    public class JsonHelper<T> where T : class, new()
    {
        /// <summary>
        /// 检查返回的记录,如果返回没有错误,或者结果提示成功,则不抛出异常
        /// </summary>
        /// <param name="content">返回的结果</param>
        /// <returns></returns>
        private static bool VerifyErrorCode(string content)
        {
            if (content.Contains("errcode"))
            {
                ErrorJsonResult errorResult = JsonConvert.DeserializeObject<ErrorJsonResult>(content);
                //非成功操作才记录异常,因为有些操作是返回正常的结果({"errcode": 0, "errmsg": "ok"})
                if (errorResult != null && errorResult.errcode != ReturnCode.请求成功)
                {
                    string error = string.Format("微信请求发生错误!错误代码:{0},说明:{1}", (int)errorResult.errcode, errorResult.errmsg);
                    LogTextHelper.Error(errorResult);

                    throw new WeixinException(error);//抛出错误
                }
            }
            return true;
        }

        /// <summary>
        /// 转换Json字符串到具体的对象
        /// </summary>
        /// <param name="url">返回Json数据的链接地址</param>
        /// <returns></returns>
        public static T ConvertJson(string url)
        {
            HttpHelper helper = new HttpHelper();
            string content = helper.GetHtml(url);
            VerifyErrorCode(content);

            T result = JsonConvert.DeserializeObject<T>(content);
            return result;
        }
}

而只要要把对象转换为Json字符串格式的数目,那么代码也很简短。

JsonConvert.SerializeObject(obj, Formatting.Indented);

 

相关文章