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

时间:2023-11-15 12:33:26

写在开头:

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

[csharp] view plaincopy
  1. using Newtonsoft.Json;
  2. using System.Text;
  3. StringBuilder sb = new StringBuilder();
  4. string str = "[{ID:'1',Name:'John',Other:[{Age:'21',Sex:'0'}]},{ID:'2',Name:'Good',Other:[{Age:'36',Sex:'1'}]}]";
  5. JavaScriptArray javascript = (JavaScriptArray)JavaScriptConvert.DeserializeObject(str);
  6. for (int i = 0; i < javascript.Count; i++ )
  7. {
  8. JavaScriptObject obj = (JavaScriptObject)javascript[i];
  9. sb.Append("ID:" + obj["ID"].ToString());
  10. sb.Append("Name:" + obj["Name"].ToString());
  11. JavaScriptArray json = (JavaScriptArray)obj["Other"];
  12. for (int j = 0; j < json.Count; j++){
  13. JavaScriptObject jsonobj = (JavaScriptObject)json[j];
  14. sb.Append("Age:" + jsonobj["Age"].ToString());
  15. sb.Append("Sex:" + jsonobj["Sex"].ToString());
  16. }
  17. }

还有一种方法是:

[csharp] view plaincopy
  1. string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";
  2. JsonReader reader = new JsonReader(new StringReader(jsonText));
  3. while (reader.Read())
  4. {
  5. textBox1.Text += "TokenType = " + reader.TokenType + "   ValueType =  " + reader.ValueType + "   Value = " + reader.Value + "\r\n";
  6. }

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

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

这是要闹哪样???

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

[csharp] view plaincopy
  1. JavaScriptArray--->JArray
  2. JavaScriptConvert--->JsonConvert
  3. JavaScriptObject--->JObject

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

使用方法总结:

1、较简单的一种

[csharp] view plaincopy
  1. using Newtonsoft.Json;
  2. using Newtonsoft.Json.Linq;
  3. string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";
  4. JArray ja =(JArray) JsonConvert.DeserializeObject(jsonText);
  5. JObject o = (JObject)ja[1];
  6. Console.WriteLine(o["a"]);
  7. Console.WriteLine(ja[1]["a"]);

2、自定义对象列表

定义一个对象:

[csharp] view plaincopy
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. /// <summary>
  6. ///Customer 的摘要说明
  7. /// </summary>
  8. public class Customer
  9. {
  10. //在序列化前后没有变动
  11. public string a { get; set; }
  12. //在序列化前后设置和重置
  13. public string b { get; set; }
  14. //设置为null,但在序列化后填充
  15. public string c { get; set; }
  16. public string Other { get; set; }
  17. public Customer()
  18. {
  19. //
  20. //TODO: 在此处添加构造函数逻辑
  21. //
  22. a = "";
  23. b = "";
  24. c = "";
  25. Other = null;
  26. }
  27. }

反序列化json字符串:

[csharp] view plaincopy
  1. using Newtonsoft.Json;
  2. using Newtonsoft.Json.Linq;
  3. string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";
  4. List<Customer> _list = JsonConvert.DeserializeObject<List<Customer>>(jsonText);
  5. Console.WriteLine(_list[1].a);
  6. foreach (Customer c in _list)
  7. {
  8. Console.WriteLine(c.c);
  9. }

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

作者:kunoy
申明:作者写博是为了总结经验,和交流学习之用。 如需转载,请尽量保留此申明,并在文章页面明显位置给出原文连接。谢谢!