C#处理Json数据

文章转载:http://www.cnblogs.com/Gun-N-Rose/archive/2012/09/28/2707053.html

这两天因为在写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的。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值