一、基本概念
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; } }
更多請參考:http://www.newtonsoft.com/json/help/html/Introduction.htm