zoukankan      html  css  js  c++  java
  • .NET中常用的几种解析JSON方法

    .NET中常用的几种解析JSON方法

     

    一、基本概念

    json是什么?

    JSON:JavaScript 对象表示法(JavaScript Object Notation)。

    JSON 是一种轻量级的数据交换格式,是存储和交换文本信息的语法。类似 XML。

    JSON 比 XML 更小、更快,更易解析。

    序列化和反序列化是怎么回事?

    序列化: 将数据结构或对象转换成二进制串的过程

    反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

    如何:对 JSON 数据进行序列化和反序列化?

    1、定义 Person 的数据协定

    通过将 DataContractAttribute 附加到类并将 DataMemberAttribute 特性附加到要序列化的成员,为Person定义数据协定。

    复制代码
    [DataContract]
        internal class Person
        {
            [DataMember]
            internal string name;
    
            [DataMember]
            internal int age;
        }
    复制代码

    2、将 Person 类型的实例序列化为 JSON

    3、从 JSON 反序列化 Person 类型的实例 

    更多参考:

    https://msdn.microsoft.com/zh-cn/library/bb412179.aspx

    https://msdn.microsoft.com/zh-cn/library/bb412170.aspx

    二、.NET中常用的几种解析JSON方法

    .NET中常用的几种解析JSON方法比较 
    名称 类库 使用场景 linq支持
    System.Runtime.Serialization.Json DataContractJsonSerializer 全部 No
    System.Web.Script.Serialization JavaScriptSerializer web No
    System.Json JsonArray、JsonObject、JsonValue Silverlight Yes
    Newtonsoft.Json JsonConvert、JArray、JObject、JValue 全部 Yes

    1、DataContractJsonSerializer

    .NET Framwork3.5自带的System.Runtime.Serialization.Json可很好的完成JSON的解析,不需要使用第三方库。

    添加引用System.Runtime.Serialization,然后使用 using System.Runtime.Serialization.Json;

    相应的序列化的类,注意下面类加的Attribute,比如:

    复制代码
        /// <summary>
        /// 异常对象
        /// </summary>
        [DataContract]
        internal class Ex
        {
            [DataMember]
            public string HelpLink { get; set; }
            [DataMember]
            public int HResult { get; set; }
    
            [DataMember]
            public string Message { get; set; }
    
            [DataMember]
            public string Source { get; set; }
    
            [DataMember]
            public string StackTrace { get; set; }
    
        }
    复制代码

    json帮助类

    复制代码
    /// <summary>
        /// json 帮助类
        /// </summary>
        internal class JsonHelper
        {
            //JSON字符串转对象
            public static T JsonToT<T>(string json)
            {
                var ser = new DataContractJsonSerializer(typeof(T));
                var stream = new MemoryStream(Encoding.UTF8.GetBytes(json));
                stream.Position = 0;
                return (T)ser.ReadObject(stream);
            }
    
            //对象转化为JSON字符串
            public static string TtoJson<T>(T obj)
            {
                var ser = new DataContractJsonSerializer(typeof(T));
                var stream = new MemoryStream();
                ser.WriteObject(stream, obj);
                var db = new byte[stream.Length];
                stream.Position = 0;
                stream.Read(db, 0, (int)stream.Length);
                var dataString = Encoding.UTF8.GetString(db);
                return dataString;
            }
    
        }
    复制代码

    使用:

     var t = JsonHelper.jsonToT<T>(jsonstr);
     var jsonstr=JsonHelper.TtoJson<T>(T);

    更多内容请参考:https://msdn.microsoft.com/zh-cn/library/bb907644.aspx

    2、JavaScriptSerializer

    using System.Web.Script.Serialization;

    var jsSerializer   = new JavaScriptSerializer();
    var json= jsSerializer.Serialize(T);
    var T = jsSerializer.Deserialize<T>(json);

    更多请参考:http://msdn.microsoft.com/zh-cn/library/bb359469.aspx

    3、System.Json

    复制代码
    // using System.Json
        
        var css = "{ "#header" : {background:"red"}, layout : [5,4,1],color:"cyan" }";
        
        var style = JsonObject.Parse(css) as JsonObject;    
        
        (
        from s in style
        where s.Key == "color"
        select (string)s.Value
        ).First().ToString();    
        // "cyan"
        
        
        // 更多操作
        style["layout"][0] = 22;
        
        var hd = style["#header"];
        style["body>div+p"] = hd;
        style.Remove("#header");
        
        var bd = new JsonObject();
        bd["border"] = "1px solid cyan";
        style["body>div+p"]["#meta"] = bd;
        style.ToString();    
        // {"layout":[22,4,1],"color":"cyan","body>div+p":{"background":"red","#meta":{"border":"1px solid cyan"}}}
    复制代码

    更多请参考:http://msdn.microsoft.com/zh-cn/library/cc626400%28v=VS.95%29.aspx

    4、JSON.NET

    json帮助类

    复制代码
    public class JsonHelper
        {
            /// <summary>   
            /// 对象转换为JSON字符串
            /// </summary>
            /// <param name="item"></param>
            /// <returns></returns>
            public static string ObjectToJson(object item)
            {
                string res = JsonConvert.SerializeObject(item);
                return res;
            }
            /// <summary>
            /// JSON转换为对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="jsonString"></param>
            /// <returns></returns>
            public static T JsonToObject<T>(string jsonString)
            {
                T res = JsonConvert.DeserializeObject<T>(jsonString);
                return res;
            }
        }
    复制代码
  • 相关阅读:
    vgrant使用简易教程
    php数组常用函数总结
    php面向对象基础知识整理之类中的属性和方法的使用
    apache和nginx的区别
    thinkphp发送邮箱(以thinkphp5作为示例)。
    利用html2canvas将当前网页保存为图片.
    作为一名程序员该如何思考自己的职业人生?
    js常用返回网页顶部几种方法
    如何本地搭建centos7虚拟主机?
    Spark报错
  • 原文地址:https://www.cnblogs.com/zxtceq/p/8310025.html
Copyright © 2011-2022 走看看