C#處理Json數據---By Li Zhang


這兩天因為在寫team project的search api的部分,需要對抓到的數據進行處理,那么首先用哪種數據呢?Json, xml?我當時覺得json格式的數據應該能夠比較好的表示一個object,於是決定用json格式的數據。然后就遇到了問題,如何處理這些數據呢?因為大家知道,json數據里有一些符號比如:, [, ], {,},\,/,如果沒有一些比較“高級”的方法處理,用c#(c++)會非常麻煩。我查了一些資料,也嘗試了好幾種,打算小小的分享一下,輕拍~

1.常見的c#處理json數據的辦法:

這個是從網上找的~(http://www.soaspx.com/dotnet/csharp/csharp_20100713_5052.html

主要類 命名空間 限制 內建LINQ支持
DataContractJsonSerializer System.Runtime.Serialization.Json 通用
JavaScriptSerializer System.Web.Script.Serialization 只能在Web環境使用
JsonArrayJsonObjectJsonValue System.Json 只能在Silverlight中使用
JsonConvertJArrayJObjectJValueJProperty Newtonsoft.Json 通用

2.我們是開發的win8上面的metro風格的app, 所以有一些類改變了,比如我沒有找到JavaScriptSerializer,Newtonsoft.Json這個庫也需要安裝,安裝的辦法(http://json.codeplex.com/)。那么我嘗試了好幾種,最后認為第一種 DataContractSerializer似乎更好一些。因為不同的json數據的結構不太相同,如果你比較熟悉你要處理的數據的結構,然后定義實體類,會比較不容易出錯。用起來也比較容易。

3.還有首先你得對json的語法有一些了解(http://www.json.org/json-zh.html)。下面是一條記錄:

{"Width":972,"Height":922,"FileSize":174702,"Thumbnail":{"Width":160,"Height":151,"FileSize":5915}}

下面我將通過如何用c#的DataContractSerializer將這條記錄反序列化。
首先你得分析這條記錄的結構,然后建出與結構相符的類出來。記得加上reference:

using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;

建出來之后,要在類定義前加上[DataContract],類里的成員前加[DataMember]

[DataContract]
public class Thumbnail
{
[DataMember]
public int Width { get; set; }
[DataMember]
public int Height { get; set; }
[DataMember]
public int FileSize { get; set; }

}

[DataContract]

public class Record

{

[DataMember]
public int Width { get; set; }
[DataMember]
public int Height { get; set; }
[DataMember]
public int FileSize { get; set; }

[DataMember]

public Thumbnail thumbnail{get;set;}

}

 

按理說,上面這樣的話就算建好了,我本來也是這樣認為的,但是總是得不到結果,網上也查不到為什么。最后,終於從一個寫過這個的同學那里得知,原來DataContractSerializer並不能主動將json數據中得各項對應到你建的類中,還需要寫清是哪一個。

所以上面對應到那條json的記錄,應該這樣寫:

[DataContract]
public class Thumbnail
{
[DataMember(Name = "Width")]
public int Width { get; set; }
[DataMember(Name = "Height")]
public int Height { get; set; }
[DataMember(Name = "FileSize")]
public int FileSize { get; set; }

}

[DataContract]

public class Record

{

[DataMember(Name = "Width")]
public int Width { get; set; }
[DataMember(Name = "Height")]
public int Height { get; set; }
[DataMember(Name = "FileSize")]
public int FileSize { get; set; }

[DataMember(Name = "Thumbnail")]

public Thumbnail thumbnail{get;set;}

}

 

 

好了,如果你已經建好了你的實體類,下面如何將Json的數據反序列化?

public static T parse<T>(string jsonString)
{

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
ms.Position = 0;
T jsonObject = (T)ser.ReadObject(ms);
return jsonObject;

}

 

調用:

Record record=parse<Record>(jsontext);

好了,如果沒錯的話,上面的那條json的記錄已經轉化成你可以直接用的Record的。

 

 

 







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM