在使用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解析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。