zoukankan      html  css  js  c++  java
  • Newtonsoft.Json.4.5.11使用方法总结---反序列化json字符串

    写在开头:

           最近项目需求,需要在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.     
    4.                 StringBuilder sb = new StringBuilder();    
    5.                 string str = "[{ID:'1',Name:'John',Other:[{Age:'21',Sex:'0'}]},{ID:'2',Name:'Good',Other:[{Age:'36',Sex:'1'}]}]";    
    6.                 JavaScriptArray javascript = (JavaScriptArray)JavaScriptConvert.DeserializeObject(str);    
    7.     
    8.                 for (int i = 0; i < javascript.Count; i++ )    
    9.                 {    
    10.                     JavaScriptObject obj = (JavaScriptObject)javascript[i];    
    11.                     sb.Append("ID:" + obj["ID"].ToString());    
    12.                     sb.Append("Name:" + obj["Name"].ToString());    
    13.                     JavaScriptArray json = (JavaScriptArray)obj["Other"];    
    14.     
    15.                     for (int j = 0; j < json.Count; j++){    
    16.                         JavaScriptObject jsonobj = (JavaScriptObject)json[j];    
    17.                         sb.Append("Age:" + jsonobj["Age"].ToString());    
    18.                         sb.Append("Sex:" + jsonobj["Sex"].ToString());    
    19.                     }    
    20.                 }    

          还有一种方法是:

    [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.   
    4.                 while (reader.Read())  
    5.                 {  
    6.                    textBox1.Text += "TokenType = " + reader.TokenType + "   ValueType =  " + reader.ValueType + "   Value = " + reader.Value + " ";  
    7.   
    8.                 }  

           第一种方法编译直接出错,根本不识别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.   
    4.     string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";  
    5.     JArray ja =(JArray) JsonConvert.DeserializeObject(jsonText);  
    6.     JObject o = (JObject)ja[1];  
    7.     Console.WriteLine(o["a"]);  
    8.     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.   
    6. /// <summary>  
    7. ///Customer 的摘要说明  
    8. /// </summary>  
    9. public class Customer  
    10. {  
    11.     //在序列化前后没有变动  
    12.     public string a { getset; }  
    13.     //在序列化前后设置和重置  
    14.     public string b { getset; }  
    15.     //设置为null,但在序列化后填充  
    16.     public string c { getset; }  
    17.     public string Other { getset; }  
    18.     public Customer()  
    19.     {  
    20.         //  
    21.         //TODO: 在此处添加构造函数逻辑  
    22.         //  
    23.         a = "";  
    24.         b = "";  
    25.         c = "";  
    26.         Other = null;  
    27.     }  
    28. }  

             反序列化json字符串:

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

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

    作者:kunoy
    申明:作者写博是为了总结经验,和交流学习之用。 如需转载,请尽量保留此申明,并在文章页面明显位置给出原文连接。谢谢!
  • 相关阅读:
    【STM32F429】第11章 ThreadX中断优先级配置,含BasePri配置方案
    【STM32H7】第10章 ThreadX任务栈大小确定及其溢出检测
    【STM32F429】第10章 ThreadX任务栈大小确定及其溢出检测
    《安富莱嵌入式周报》第216期:2021.06.07--2021.06.13
    嵌入式新闻早班车-第3期
    嵌入式新闻早班车-第2期
    Keil Studio已经确定为MDK下一代开发工具,更多功能将在今年年底上线
    嵌入式新闻早班车-第1期
    【STM32H7的DSP教程】第32章 STM32H7的实数FFT的逆变换(支持单精度和双精度)
    【STM32F429的DSP教程】第32章 STM32F429的实数FFT的逆变换(支持单精度和双精度)
  • 原文地址:https://www.cnblogs.com/wuyifu/p/3299796.html
Copyright © 2011-2022 走看看