一、基本概念
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方法
名称 | 类库 | 使用场景 | 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; ???????} ???}