现在的位置: 首页 > 综合 > 正文

.NET 中JSON反序列化经验分享

2012年08月18日 ⁄ 综合 ⁄ 共 1525字 ⁄ 字号 评论关闭

  这几天一直.Net中处理JSON数据,走了很多弯路,还是技术不行的问题,太多东西不懂,最终还是解决了,分享下经验

  在.Net4.0中已经提供的很友好的Json处理方法,我们可以方便的添加System.Runtime.Serializaton.Json这个引用,利用其中的方法进行处理,这个大家可以通过查询MSDN得到很好的解答,需要注意的是使用System.Runtime.Serializaton.Json这个引用之前需要添加System.ServiceModel.Web和System.Runtime.Serializaton,他们之间的调用关系可以通过Reflector进行查看。

JSON数据反序列化为泛型T

1 DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(T));
2 MemoryStream ms = new MemoryStrea(Encoding.Unicode.GetBytes(jsonString));
3 T t = (T)dcjs.ReadObject(ms);

      在.Net 3.5中我查到资料是已经支持我上面说的第一种方法,我这里调用一直会出现问题,可能是我DLL的版本问题导致的,没有进行深入的研究。上网搜了下,找到了开源的json.NET的DLL,下载地址:http://json.codeplex.com/

  json.NET中提供了较多了方法给我们使用,灵活度相当的高,我这里举两个简单的例子:

  在我们需要反序列化的类和json中的数据完全匹配的情况下,使用DeserializeObject方法是最方便快速的,切忌类型要一致,否则会出现无法转换的错误。

在匹配的情况下json to a .net object

T or= JsonConvert.DeserializeObject<T>(jsonString);

  如果我们需要更灵活的反序列化方法,可以使用Newtonsoft.Json.Linq下的JObject进行,利用这个方法我们就可以很方便的控制反序列化后每个属性的类型,具体看例子,例子来着json.NET的文档:

灵活的反序列化

1 string jsonText = @"{
2 ""short"":{
3 ""original"":""http://www.foo.com/"",
4 ""short"":""krehqk"",
5 ""error"":{
6 ""code"":0,
7 ""msg"":""No action taken""}
8 }";
9
10 JObject json = JObject.Parse(jsonText);
11
12 Shortie shortie = new Shortie
13 {
14 Original = (string)json["short"]["original"],
15 Short = (string)json["short"]["short"],
16 Error = new ShortieException
17 {
18 Code = (int)json["short"]["error"]["code"],
19 ErrorMessage = (string)json["short"]["error"]["msg"]
20 }
21 };
22
23 Console.WriteLine(shortie.Original);
24 // http://www.foo.com/
25
26 Console.WriteLine(shortie.Error.ErrorMessage);
27 // No action taken

  还是个初学者,还有很多东西要学习,有什么错误和补充的地方,希望大家积极留意~

抱歉!评论已关闭.