在使用DataContractJsonSerializer進行解析之前,我們首先需要將兩個包引入進來:
 
using System.Runtime.Serialization;
 using System.Runtime.Serialization.Json;
 
接下來需要新建一個class,DataContractJsonSerializer可以將JSON字符串轉化為指定的class或者將class轉化為JSON字符串。
 
這次我接受的JSON數據格式為:
 
{ "ret": "0", "Isupdate": "1", "Newver": "V1.1.0" }
 
我們新建的class也要遵照上述格式,代碼如下:
 
using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Runtime.Serialization;
 ?
 namespace AutoUpdater_Client.Model
 {
 ? ? //從更新服務器返回的更新信息
 ? ? [DataContract]
 ? ? class UpdateInfoJSON
 ? ? {
 ? ? ? ? //"{ \"ret\": \"0\", \"Isupdate\": \"1\", \"Newver\": \"V1.1.0\" }";
 ? ? ? ? //返回值,為0表示獲取信息成功
 ? ? ? ? [DataMember(Order = 0)]
 ? ? ? ? public int ret { get; set; }
 ? ? ? ? //是否需要更新,0表示不需要,1表示需要
 ? ? ? ? [DataMember(Order = 1)]
 ? ? ? ? public int Isupdate { get; set; }
 ? ? ? ? //最新版本號
 ? ? ? ? [DataMember(Order = 2)]
 ? ? ? ? public string Newver { get; set; }
 ?
 ? ? }
 }
 請注意上述class中的DataContract和DataMember這兩個屬性,因為DataContractJsonSerializer在進行序列化的時候需要他們,所以一定要記得加上。
 另外,這兩個屬性的使用也需要引入
 
System.Runtime.Serialization
 
接下來我們可以來寫解析的代碼了:
 
string result = "{ \"ret\": \"0\", \"Isupdate\": \"1\", \"Newver\": \"V1.1.0\" }";
 //解析從服務端返回的JSON結果
 var mStream = new MemoryStream(Encoding.Default.GetBytes(result));
 var serializer = new DataContractJsonSerializer(typeof(UpdateInfoJSON));
 UpdateInfoJSON updateInfo = (UpdateInfoJSON)serializer.ReadObject(mStream);
 接下來就可以訪問updateInfo中的各個屬性了,完成。
 ————————————————
 
//*************JSON-DataContractJsonSerializer解析
 
C#中使用JSON不需要使用第三方庫,使用.NET Framwork3.5自帶的System.Runtime.Serialization.Json即可很好的完成JSON的解析。
 
關于JSON的入門介紹見(首頁的圖很形象):
 
http://www.json.org/
 
一、Using
 
需要添加引用:System.ServiceModel.Web 和 System.Runtime.Serialization,然后使用Using:
 
using?System.Runtime.Serialization.Json;
 using?System.Runtime.Serialization;
 
?二、定義序列化的類
 
假如我們要轉化的JSON字符串格式為:
 
 
{
 ????"encoding":"UTF-8",
 ????"plug-ins":["python","c++","ruby"],
 ????"indent":{
 ????????"length":3,
 ????????"use_space":true
 ????}
 }
 
 
?
 
然后編寫相應的序列化的類,注意下面類加的Attribute:
 
[DataContract(Namespace?=?"http://coderzh.cnblogs.com")]
 class?Config
 {
 ????[DataMember(Order?=?0)]
 ????public?string?encoding?{?get;?set;?}
 ????[DataMember(Order?=?1)]
 ????public?string[]?plugins?{?get;?set;?}
 ????[DataMember(Order?=?2)]
 ????public?Indent?indent?{?get;?set;?}
 }
 [DataContract(Namespace?=?"http://coderzh.cnblogs.com")]
 class?Indent
 {
 ????[DataMember(Order?=?0)]
 ????public?int?length?{?get;?set;?}
 ????[DataMember(Order?=?1)]
 ????public?bool?use_space?{?get;?set;?}
 }
 
三、對象轉化為JSON字符串
 
?
 
使用WriteObject方法:
 
 var?config?=?new?Config(){
 ?????????????????????????encoding?=?"UTF-8",
 ?????????????????????????plugins?=?new?string[]{"python",?"C++",?"C#"},
 ?????????????????????????indent?=?new?Indent(){?length?=?4,?use_space?=?false}
 ?????????????????????????};
 var?serializer?=?new?DataContractJsonSerializer(typeof(Config));
 var?stream?=?new?MemoryStream();
 serializer.WriteObject(stream,?config);
 byte[]?dataBytes?=?new?byte[stream.Length];
 stream.Position?=?0;
 stream.Read(dataBytes,?0,?(int)stream.Length);
 string?dataString?=?Encoding.UTF8.GetString(dataBytes);
 Console.WriteLine("JSON?string?is:");
 Console.WriteLine(dataString);
 
四、JSON字符串轉對象
 
使用ReadObject方法:
 
ReadObject
 
?五、輸出結果:
 
 
JSON?string?is:
 {"encoding":"UTF-8","plugins":["python","C++","C#"],"indent":{"length":4,"use_space":false}}
 Encoding?is:?UTF-8
 plugins?is:?python
 plugins?is:?C++
 plugins?is:?C#
 indent.length?is:?4
 indent.use_space?is:?False
 
 
?
 
//***********使用List和Json格式相互轉化的總結
 
如Json格式[{"id":"1","name":"sara"},{"id":"2","name":"sara2"}]
 
自定義數據類型,用于List<>:
 
 [DataContract]class Person {[DataMember]public int id;[DataMember]public string name;} 
?
 
程序中使用:
 
首先加入引用:
 
using System.Runtime.Serialization.Json;
 using System.Runtime.Serialization;
 using System.Text;
 
代碼內容:
 
class Program{static void Main(string[] args){//Product.GetAllSmartPhones();List<Person> nums = new List<Person>();nums.Add(new Person() { id=1,name="sara"});nums.Add(new Person() { id=1,name="sylar"});DataContractJsonSerializer json = new DataContractJsonSerializer(nums.GetType());string szJson = "";//序列化using (MemoryStream stream = new MemoryStream()){json.WriteObject(stream, nums);szJson = Encoding.UTF8.GetString(stream.ToArray());}Console.WriteLine(szJson);Console.ReadLine();}} 
工程化時,可以對自定義數據結構重新定義一個類:
 
如:
 
public?class?TestListResult<T>?:?List<T>
 ????{
 ????????public?TestListResult()
 ????????{
 ????????????this.Successed?=?false;
 ????????????this.Message?=?"";
 ????????}
 ????????public?bool?Successed?{?get;?set;?}
 ????????public?string?Message?{?get;?set;?}
 ????}
 
使用時同上在一個文件里一樣
 
理解了以上原理,可以使用以下函數在項目中使用:
 
List<T>轉Json
 
?
 
[html]?view plaincopy
 
public?static?string?Obj2Json<T>(T?data)??{??????try??????{??????????System.Runtime.Serialization.Json.DataContractJsonSerializer?serializer?=?new?System.Runtime.Serialization.Json.DataContractJsonSerializer(data.GetType());??????????using?(MemoryStream?ms?=?new?MemoryStream())??????????{??????????????serializer.WriteObject(ms,?data);??????????????return?Encoding.UTF8.GetString(ms.ToArray());??????????}??????}??????catch??????{??????????return?null;??????}??}??
 Json轉List<T>
 
?
 
[html]?view plaincopy
 
public?static?Object?Json2Obj(String?json,Type?t)??{??????try??????{??????????System.Runtime.Serialization.Json.DataContractJsonSerializer?serializer?=?new?System.Runtime.Serialization.Json.DataContractJsonSerializer(t);??????????using?(MemoryStream?ms?=?new?MemoryStream(Encoding.UTF8.GetBytes(json)))??????????{????????????????????????????return??serializer.ReadObject(ms);??????????}??????}??????catch??????{??????????return?null;??????}??}??
 DataTable 轉Json
 
?
 
[html]?view plaincopy
 
public?static?string?DataTable2Json(DataTable?dt)??{??????if?(dt.Rows.Count?==?0)??????{??????????return?"";??????}?????????StringBuilder?jsonBuilder?=?new?StringBuilder();??????//?jsonBuilder.Append("{");???????//jsonBuilder.Append(dt.TableName.ToString());????????jsonBuilder.Append("[");//轉換成多個model的形式??????for?(int?i?=?0;?i?<?dt.Rows.Count;?i++)??????{??????????jsonBuilder.Append("{");??????????for?(int?j?=?0;?j?<?dt.Columns.Count;?j++)??????????{??????????????jsonBuilder.Append("\"");??????????????jsonBuilder.Append(dt.Columns[j].ColumnName);??????????????jsonBuilder.Append("\":\"");??????????????jsonBuilder.Append(dt.Rows[i][j].ToString());??????????????jsonBuilder.Append("\",");??????????}??????????jsonBuilder.Remove(jsonBuilder.Length?-?1,?1);??????????jsonBuilder.Append("},");??????}??????jsonBuilder.Remove(jsonBuilder.Length?-?1,?1);??????jsonBuilder.Append("]");??????//??jsonBuilder.Append("}");??????return?jsonBuilder.ToString();??}??
 單個對象轉JSON
 
?
 
[html]?view plaincopy
 
public?static?T?Json2Obj<T>(string?json)???{??????T?obj?=?Activator.CreateInstance<T>();??????using?(System.IO.MemoryStream?ms?=?new?System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)))??????{??????????System.Runtime.Serialization.Json.DataContractJsonSerializer?serializer?=?new?System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());??????????return?(T)serializer.ReadObject(ms);??????}??}??
將函數封裝成類,更便于項目中引用:
 
?
 
[html]?view plaincopy
 
public?class?JsonHelper?????{?????????///?<summary>?????????///?生成Json格式?????????///?</summary>?????????///?<typeparam?name="T"></typeparam>?????????///?<param?name="obj"></param>?????????///?<returns></returns>?????????public?static?string?GetJson<T>(T?obj)?????????{?????????????DataContractJsonSerializer?json?=?new?DataContractJsonSerializer(obj.GetType());?????????????using?(MemoryStream?stream?=?new?MemoryStream())?????????????{?????????????????json.WriteObject(stream,?obj);?????????????????string?szJson?=?Encoding.UTF8.GetString(stream.ToArray());??????????????????return?szJson;?????????????}?????????}?????????///?<summary>?????????///?獲取Json的Model?????????///?</summary>?????????///?<typeparam?name="T"></typeparam>?????????///?<param?name="szJson"></param>?????????///?<returns></returns>?????????public?static?T?ParseFromJson<T>(string?szJson)?????????{?????????????T?obj?=?Activator.CreateInstance<T>();?????????????using?(MemoryStream?ms?=?new?MemoryStream(Encoding.UTF8.GetBytes(szJson)))?????????????{?????????????????DataContractJsonSerializer?serializer?=?new?DataContractJsonSerializer(obj.GetType());?????????????????return?(T)serializer.ReadObject(ms);?????????????}?????????}?????}??
[html]?view plaincopy
 
///?<summary>?????????///?反回JSON數據到前臺?????????///?</summary>?????????///?<param?name="dt">數據表</param>?????????///?<returns>JSON字符串</returns>?????????public?string?DataTableToJson(DataTable?dt)?????????{?????????????StringBuilder?JsonString?=?new?StringBuilder();?????????????if?(dt?!=?null?&&?dt.Rows.Count?>?0)?????????????{?????????????????JsonString.Append("{?");?????????????????JsonString.Append("\"TableInfo\":[?");?????????????????for?(int?i?=?0;?i?<?dt.Rows.Count;?i++)?????????????????{?????????????????????JsonString.Append("{?");?????????????????????for?(int?j?=?0;?j?<?dt.Columns.Count;?j++)?????????????????????{?????????????????????????if?(j?<?dt.Columns.Count?-?1)?????????????????????????{?????????????????????????????JsonString.Append("\""?+?dt.Columns[j].ColumnName.ToString()?+?"\":"?+?"\""?+?dt.Rows[i][j].ToString()?+?"\",");?????????????????????????}?????????????????????????else?if?(j?==?dt.Columns.Count?-?1)?????????????????????????{?????????????????????????????JsonString.Append("\""?+?dt.Columns[j].ColumnName.ToString()?+?"\":"?+?"\""?+?dt.Rows[i][j].ToString()?+?"\"");?????????????????????????}?????????????????????}?????????????????????if?(i?==?dt.Rows.Count?-?1)?????????????????????{?????????????????????????JsonString.Append("}?");?????????????????????}?????????????????????else?????????????????????{?????????????????????????JsonString.Append("},?");?????????????????????}?????????????????}?????????????????JsonString.Append("]}");?????????????????return?JsonString.ToString();?????????????}?????????????else?????????????{?????????????????return?null;?????????????}?????????}??
 表的轉化Json類:
 
[html]?view plaincopy
 
public?static?class?JsonTableHelper??????{??????????///?<summary>???????????///?返回對象序列化???????????///?</summary>???????????///?<param?name="obj">源對象</param>???????????///?<returns>json數據</returns>???????????public?static?string?ToJson(this?object?obj)??????????{??????????????JavaScriptSerializer?serialize?=?new?JavaScriptSerializer();??????????????return?serialize.Serialize(obj);??????????}????????????///?<summary>???????????///?控制深度???????????///?</summary>???????????///?<param?name="obj">源對象</param>???????????///?<param?name="recursionDepth">深度</param>???????????///?<returns>json數據</returns>???????????public?static?string?ToJson(this?object?obj,?int?recursionDepth)??????????{??????????????JavaScriptSerializer?serialize?=?new?JavaScriptSerializer();??????????????serialize.RecursionLimit?=?recursionDepth;??????????????return?serialize.Serialize(obj);??????????}????????????///?<summary>???????????///?DataTable轉為json???????????///?</summary>???????????///?<param?name="dt">DataTable</param>???????????///?<returns>json數據</returns>???????????public?static?string?ToJson(DataTable?dt)??????????{??????????????Dictionary<string,?object>?dic?=?new?Dictionary<string,?object>();????????????????int?index?=?0;??????????????foreach?(DataRow?dr?in?dt.Rows)??????????????{??????????????????Dictionary<string,?object>?result?=?new?Dictionary<string,?object>();????????????????????foreach?(DataColumn?dc?in?dt.Columns)??????????????????{??????????????????????result.Add(dc.ColumnName,?dr[dc].ToString());??????????????????}??????????????????dic.Add(index.ToString(),?result);??????????????????index++;??????????????}??????????????return?ToJson(dic);??????????}??????}??
 在Asp.net中前后臺Json數據的傳遞
 
一、前臺產生Json數據傳遞給后臺處理
 
前臺生成Json數據要使用javascript和json.js。
 
json.js 下載地址:http://www.json.org/json.js
 
?
 
?
 
前臺代碼:
 
?
 
[html]?view plaincopy
 
var?people?=?[{?"UserName":?"t1",?"PassWord":?"111111",?"Sex":?"男"?},{?"UserName":?"t2",?"PassWord":?"222222",?"Sex":?"女"?}];??var?url?=?"Default.aspx?people="?+?escape(people.toJSONString());??request.open("POST",?url,?true);??request.onreadystatechange?=?updatePage;??request.send(null);??
 后臺處理代碼:
 
同上面的轉化原理一樣,我們先建立一個json數據類,便于List<>中使用。
 
?
 
[html]?view plaincopy
 
[DataContract]//序列化??public?class?TestObj??{??????[DataMember]??????public?string?UserName?{?get;?set;?}???????[DataMember]??????public?string?PassWord?{?get;?set;?}???????[DataMember]??????public?string?Sex?{?get;?set;?}??????public?TestObj(string?u,string?p,string?s)??????{??????????UserName?=?u;??????????PassWord?=?p;??????????Sex?=?s;??????}??}??
 對前臺提交的Json數據相互轉化函數
 
?
 
[html]?view plaincopy
 
//json?序列化????????public?static?string?ToJsJson(object?item)??????{??????????DataContractJsonSerializer?serializer?=?new?DataContractJsonSerializer(item.GetType());??????????using(MemoryStream?ms=new?MemoryStream())??????????{??????????????serializer.WriteObject(ms,?item);??????????????StringBuilder?sb?=?new?StringBuilder();??????????????sb.Append(Encoding.UTF8.GetString(ms.ToArray()));??????????????return?sb.ToString();??????????}??????}????????//反序列化????????public?static?T?FromJsonTo<T>(string?jsonString)??????{??????????DataContractJsonSerializer?ser?=?new?DataContractJsonSerializer(typeof(T));??????????using?(MemoryStream?ms?=?new?MemoryStream(Encoding.UTF8.GetBytes(jsonString)))??????????{??????????????T?jsonObject?=?(T)ser.ReadObject(ms);??????????????return?jsonObject;??????????}??????}??
 在后臺代碼中調用以上函數進行對數據people的處理:
 
?
 
[html]?view plaincopy
 
//獲取json字符串?????????string?jsonStr?=?Request["people"];?????????List<TestObj>?obj?=?Json.FromJsonTo<List<TestObj>>(jsonStr);?????????foreach?(TestObj?item?in?obj)?????????????{??????????Response.Write(string.Format("UserName:{0},Password:{1},Sex:{2}/r/n",?item.UserName,?item.PassWord,?item.Sex));?????????????}?????????Response.End();??
 最終的結果:
 
?
 
[html]?view plaincopy
 
List<TestObj>?Users?=?new?List<TestObj>();??Users.Add(new?TestObj("t1",?"1",?"男"));??Users.Add(new?TestObj("t2",?"2",?"女"));??string?json?=?Json.ToJsJson(Users);??Response.Write(json);??Response.End();??
 二、前臺獲取后臺提交的Json數據
 
后臺產生Json數據的方法如上原理中提到的:
 
?
 
[html]?view plaincopy
 
string?Json;????????DataContractJsonSerializer?json?=?new?DataContractJsonSerializer(list.GetType());?????????????????using?(MemoryStream?stream?=?new?MemoryStream())?????????????????{?????????????????????json.WriteObject(stream,?list);??????????????????????Json?=?Encoding.UTF8.GetString(stream.ToArray());??????????????????????????????????????}?????????return?Json;?????
[html]?view plaincopy
 
///?<summary>????///?Json的數據結構????///?</summary>????[DataContract]????class?ResultJson????{????????[DataMember]????????public?bool?Result;????????[DataMember]????????public?int?Count;????????[DataMember]????????public?string?Message;????}??
 前臺獲取后臺返回的Json字符串:
 ?
 
?
 
[html]?view plaincopy
 
function?updatePage()?{????????????if?(request.readyState?==?4)?{????????????????if?(request.status?==?200)?{????????????????????var?response?=?request.responseText;????????????????????//轉化成對象????????????????????//方法1????????????????????????response?=?response.parseJSON();????????????????????//方法2????????????????????//?response?=?eval("("?+?response?+?")");????????????????????//對象訪問方式????????????????????document.getElementById("d1").innerHTML?=?response[1].Sex;????????????????????//直接輸出???????????????????//?document.getElementById("d1").innerHTML?=?response;????????????????}????????????}????????}??
 復雜的Json字符串操作方法:
 
假如我們要轉化的JSON字符串格式為:
 
?
 
[html]?view plaincopy
 
{??????"encoding":"UTF-8",??????"plug-ins":["python","c++","ruby"],??????"indent":{??????????"length":3,??????????"use_space":true??????}??}??
然后編寫相應的序列化的類,注意下面Indent類加的屬性:
 
[html]?view plaincopy
 
[DataContract]??class?Config??{??????[DataMember(Order?=?0)]??????public?string?encoding?{?get;?set;?}??????[DataMember(Order?=?1)]??????public?string[]?plugins?{?get;?set;?}??????[DataMember(Order?=?2)]??????public?Indent?indent?{?get;?set;?}??}????[DataContract]??class?Indent??{??????[DataMember(Order?=?0)]??????public?int?length?{?get;?set;?}??????[DataMember(Order?=?1)]??????public?bool?use_space?{?get;?set;?}??}??
?
 
輸出JSON字符串
 
?
 
[html]?view plaincopy
 
var?config?=?new?Config(){???????????????????????????encoding?=?"UTF-8",???????????????????????????plugins?=?new?string[]{"python",?"C++",?"C#"},???????????????????????????indent?=?new?Indent(){?length?=?4,?use_space?=?false}???????????????????????????};??var?serializer?=?new?DataContractJsonSerializer(typeof(Config));??var?stream?=?new?MemoryStream();??serializer.WriteObject(stream,?config);????byte[]?dataBytes?=?new?byte[stream.Length];????stream.Position?=?0;????stream.Read(dataBytes,?0,?(int)stream.Length);????string?dataString?=?Encoding.UTF8.GetString(dataBytes);????Console.WriteLine("JSON?string?is:");??Console.WriteLine(dataString);??
結果:
 
[html]?view plaincopy
 
JSON?string?is:??{"encoding":"UTF-8","plugins":["python","C++","C#"],"indent":{"length":4,"use_space":false}}??
 讀取Json字符串內容:
 
?
 
[html]?view plaincopy
 
var?mStream?=?new?MemoryStream(Encoding.Default.GetBytes(dataString));??Config?readConfig?=?(Config)serializer.ReadObject(mStream);????Console.WriteLine("Encoding?is:?{0}",?readConfig.encoding);??foreach?(string?plugin?in?readConfig.plugins)??{??????Console.WriteLine("plugins?is:?{0}",?plugin);??}??Console.WriteLine("indent.length?is:?{0}",?readConfig.indent.length);??Console.WriteLine("indent.use_space?is:?{0}",?readConfig.indent.use_space);??
結果:
 
[html]?view plaincopy
 
Encoding?is:?UTF-8??plugins?is:?python??plugins?is:?C++??plugins?is:?C#??indent.length?is:?4??indent.use_space?is:?False??
                            總結
                            
                                以上是生活随笔為你收集整理的C#使用DataContractJsonSerializer来进行JSON解析的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。