這兩天因為在寫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環境使用 | 否 |
JsonArray、JsonObject、JsonValue | System.Json | 只能在Silverlight中使用 | 是 |
JsonConvert、JArray、JObject、JValue、JProperty | 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的。