您的位置:首页 > Web前端 > JavaScript

Newtonsoft.Json.4.5.11使用方法总结---反序列化json字符串

2013-09-03 21:47 477 查看
写在开头:

最近项目需求,需要在C#中处理json字符串,毫不犹豫的下载了Newtonsoft.Json 4.5.11(2012.12.17)http://json.codeplex.com/,然后百度教程,还比较多(心喜),大致方法类似如下:

[csharp] view plaincopy

using Newtonsoft.Json;

using System.Text;

StringBuilder sb = new StringBuilder();

string str = "[{ID:'1',Name:'John',Other:[{Age:'21',Sex:'0'}]},{ID:'2',Name:'Good',Other:[{Age:'36',Sex:'1'}]}]";

JavaScriptArray javascript = (JavaScriptArray)JavaScriptConvert.DeserializeObject(str);

for (int i = 0; i < javascript.Count; i++ )

{

JavaScriptObject obj = (JavaScriptObject)javascript[i];

sb.Append("ID:" + obj["ID"].ToString());

sb.Append("Name:" + obj["Name"].ToString());

JavaScriptArray json = (JavaScriptArray)obj["Other"];

for (int j = 0; j < json.Count; j++){

JavaScriptObject jsonobj = (JavaScriptObject)json[j];

sb.Append("Age:" + jsonobj["Age"].ToString());

sb.Append("Sex:" + jsonobj["Sex"].ToString());

}

}

还有一种方法是:

[csharp] view plaincopy

string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";

JsonReader reader = new JsonReader(new StringReader(jsonText));

while (reader.Read())

{

textBox1.Text += "TokenType = " + reader.TokenType + " ValueType = " + reader.ValueType + " Value = " + reader.Value + "\r\n";

}

第一种方法编译直接出错,根本不识别JavaScriptArray,JavaScriptObject,就连JavaScriptConvert方法也木有,靠!那好吧,第二种总行了吧,提示:

错误 2 无法创建抽象类或接口“Newtonsoft.Json.JsonReader”的实例

这是要闹哪样???

后面查看了Newtonsoft.Json库中的方法,根本没有嘛!再百度,终于有位仁兄说在新版中JavaScriptArray变成了JArray,顺着这个思路,发现变化如下:

[csharp] view plaincopy

JavaScriptArray--->JArray

JavaScriptConvert--->JsonConvert

JavaScriptObject--->JObject

仔细看看,人家这样改更规范了嘛!

使用方法总结:

1、较简单的一种

[csharp] view plaincopy

using Newtonsoft.Json;

using Newtonsoft.Json.Linq;

string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";

JArray ja =(JArray) JsonConvert.DeserializeObject(jsonText);

JObject o = (JObject)ja[1];

Console.WriteLine(o["a"]);

Console.WriteLine(ja[1]["a"]);

2、自定义对象列表

定义一个对象:

[csharp] view plaincopy

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

/// <summary>

///Customer 的摘要说明

/// </summary>

public class Customer

{

//在序列化前后没有变动

public string a { get; set; }

//在序列化前后设置和重置

public string b { get; set; }

//设置为null,但在序列化后填充

public string c { get; set; }

public string Other { get; set; }

public Customer()

{

//

//TODO: 在此处添加构造函数逻辑

//

a = "";

b = "";

c = "";

Other = null;

}

}

反序列化json字符串:

[csharp] view plaincopy

using Newtonsoft.Json;

using Newtonsoft.Json.Linq;

string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";

List<Customer> _list = JsonConvert.DeserializeObject<List<Customer>>(jsonText);

Console.WriteLine(_list[1].a);

foreach (Customer c in _list)

{

Console.WriteLine(c.c);

}

我感觉两种方法各有好处,第二种虽然需要再写一个对象,但可以像在js里面一样使用,感觉很爽!

作者:kunoy
出处:http://blog.csdn.net/kunoy
申明:作者写博是为了总结经验,和交流学习之用。 如需转载,请尽量保留此申明,并在文章页面明显位置给出原文连接。谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: