Newtonsoft.Json.dll 反序列化JSON字符串

 

    上一篇JSON博客JSON入门级学习小结--JSON数据结构中已对JSON做了简单介绍,JSON字符串数组数据样式大概是这样子的:

    

    

    如今因为项目需求(asp.net web网站,前台向后台传递JSON数据,并对JSON数据处理,详述见博客《 

《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

》),需要对传递的JSON数据反序列化。于是从网上找了许多JSON反序列化的例子,最终决定使用Newtonsoft.Json.dll 反序列化JSON字符串,当然它也可以序列化JSON字符串, Newtonsoft.Json.dll下载链接

    

    使用Newtonsoft.Json.dll反序列化JSON字符串的步骤:

    1.对Newtonsoft.Json.dll添加引用

     将Newtonsoft.Json.dll文件拷贝至界面层的Bin目录下,然后右击Bin,弹出“添加引用”页,然后点击“浏览”,然后找到界面层的Bin文件夹,找到Newtonsoft.Json.dll文件,然后点击"添加",引用添加成功!

     

    

    2.在需要对JSON字符串处理的界面,引用JSON空间,并对JSON进行处理

      网上解决办法大致如下:

     方法1:

//引用JSON解析使用的空间
using Newtonsoft.Json;    
using System.Text;  
  
//定义一个可变字符串数组
StringBuilder sb = new StringBuilder();
//定义一个JSON字符串str
string str = "[{ID:'1',Name:'John',Other:[{Age:'21',Sex:'0'}]},{ID:'2',Name:'Good',Other:[{Age:'36',Sex:'1'}]}]";
//反序列化JSON数据
JavaScriptArray javascript = (JavaScriptArray)JavaScriptConvert.DeserializeObject(str);
//依次读取反序列化的JSON数据,并将各数据写入可变字符串数组中
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());
    //反序列化JSON数据
    JavaScriptArray json = (JavaScriptArray)obj["Other"];
            
    //依次读取反序列化的JSON数据,并将各数据写入可变字符串数组中
    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());
    }
}      

还有一种方法是:

//定义一个JSON字符串str  
string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";  
 //反序列化JSON数据
JsonReader reader = new JsonReader(new StringReader(jsonText));  
  //依次读取反序列化的JSON数据
    while (reader.Read())  
    {  
        textBox1.Text += "TokenType = " + reader.TokenType + "   ValueType =  " + reader.ValueType + "   Value = " + reader.Value + "\r\n";  
  
    }  

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

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

       这是怎么回事???

       后来在搜到的文章中,发现新版中JavaScriptArray变成了JArray,顺着这个思路,发现变化如下:

      

JavaScriptArray--->JArray  
JavaScriptConvert--->JsonConvert  
JavaScriptObject--->JObject

   其实这样更改更规范吧!


下面介绍新版本Newtonsoft.Json.dll反序列化JSON字符串的方法

    1.直接反序列化JSON字符串

      

//引用序列化、反序列化JSON字符串用到的空间
using Newtonsoft.Json;  
using Newtonsoft.Json.Linq; 
 
 //定义一个JSON字符串 
string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";  
//反序列化JSON字符串
JArray ja =(JArray) JsonConvert.DeserializeObject(jsonText); 
 //将反序列化的JSON字符串转换成对象
JObject o = (JObject)ja[1];  
//读取对象中的各项值
Console.WriteLine(o["a"]);  
Console.WriteLine(ja[1]["a"]);  

    2.定义对象列表,然后反序列化JSON字符串

      2.1 添加一个类,定义一个对象

    

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;
    }
}

     2.2 反序列化JSON字符串

   

//引用序列化、反序列化JSON字符串用到的空间
using Newtonsoft.Json;  
using Newtonsoft.Json.Linq; 
//定义一个JSON字符串 
string jsonText = "[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";  
//反序列化JSON字符串,将JSON字符串转换成LIST列表
List<Customer> _list = JsonConvert.DeserializeObject<List<Customer>>(jsonText);  
//读取列表中的值
Console.WriteLine(_list[1].a);  
foreach (Customer c in _list)  
{  
    Console.WriteLine(c.c);  
} 

    我感觉这两种反序列化JSON的方法都挺好,其实还用很多方式可以反序列化JSON,本文仅仅借助了Newtonsoft.Json.dll这个工具! 


  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
JSON是基于JAVA8编写,对比阿里的JSON三次测试结果如下: 10万次序列化,1万次反序列化,毫秒。 阿里序列化时间 1122 1054 1115 阿里反序列化时间 409 423 412 HZS序列化时间 884 864 880 HZS反序列化时间 392 375 394 JAVA7版已经逼近阿里的速度,JAVA8版利用了闭包技术,充份发挥多核优势,已经超过阿里的速度。 测试代码如下: { org.hzs.json.JSONObject bjson; java.util.LinkedList<String> jd_Set = new java.util.LinkedList<>(); java.util.Random d1 = new java.util.Random(); java.util.UUID d2; int ji_i; long ji起始时间_i; long ji截至时间_i; java.util.Date date = new java.util.Date(); //生成1万个序列化後的文本 for (ji_i = 0; ji_i < 10000; ji_i++) { bjson = org.hzs.json.JSONObject.d副本(); bjson.put("a1", d1.nextDouble()); bjson.put("a2", d1.nextDouble()); bjson.put("a3", d1.nextDouble()); bjson.put("a4", d1.nextInt()); bjson.put("a5", d1.nextInt()); bjson.put("a6", d1.nextLong()); bjson.put("a7", d1.nextBoolean()); d2 = java.util.UUID.randomUUID(); bjson.put("b1", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b2", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b3", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b4", d2.toString()); bjson.put("c", new java.util.Date()); jd_Set.add(bjson.toString()); } com.alibaba.fastjson.JSONObject ajson, a1json = new com.alibaba.fastjson.JSONObject(); ji起始时间_i = java.util.Calendar.getInstance().getTimeInMillis(); for (ji_i = 0; ji_i < 100000; ji_i++) { ajson = (com.alibaba.fastjson.JSONObject) a1json.clone(); ajson.put("a1", d1.nextDouble()); ajson.put("a2", d1.nextDouble()); ajson.put("a3", d1.nextDouble()); ajson.put("a4", d1.nextInt()); ajson.put("a5", d1.nextInt()); ajson.put("a6", d1.nextLong()); ajson.put("a7", d1.nextBoolean()); d2 = java.util.UUID.randomUUID(); ajson.put("b1", d2.toString()); d2 = java.util.UUID.randomUUID(); ajson.put("b2", d2.toString()); d2 = java.util.UUID.randomUUID(); ajson.put("b3", d2.toString()); d2 = java.util.UUID.randomUUID(); ajson.put("b4", d2.toString()); ajson.put("c", new java.util.Date()); ajson.toString(); } ji截至时间_i = java.util.Calendar.getInstance().getTimeInMillis(); System.out.print("阿里变量序列化时间:"); System.out.println(ji截至时间_i - ji起始时间_i); ji起始时间_i = java.util.Calendar.getInstance().getTimeInMillis(); for (ji_i = 0; ji_i < 10000; ji_i++) { ajson = com.alibaba.fastjson.JSONObject.parseObject(jd_Set.get(ji_i)); } ji截至时间_i = java.util.Calendar.getInstance().getTimeInMillis(); System.out.print("阿里反序列化时间:"); System.out.println(ji截至时间_i - ji起始时间_i); ji起始时间_i = java.util.Calendar.getInstance().getTimeInMillis(); for (ji_i = 0; ji_i < 100000; ji_i++) { bjson = org.hzs.json.JSONObject.d副本(); bjson.put("a1", d1.nextDouble()); bjson.put("a2", d1.nextDouble()); bjson.put("a3", d1.nextDouble()); bjson.put("a4", d1.nextInt()); bjson.put("a5", d1.nextInt()); bjson.put("a6", d1.nextLong()); bjson.put("a7", d1.nextBoolean()); d2 = java.util.UUID.randomUUID(); bjson.put("b1", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b2", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b3", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b4", d2.toString()); bjson.put("c", new java.util.Date()); bjson.toString(); } ji截至时间_i = java.util.Calendar.getInstance().getTimeInMillis(); System.out.print("HZS变量序列化时间:"); System.out.println(ji截至时间_i - ji起始时间_i); ji起始时间_i = java.util.Calendar.getInstance().getTimeInMillis(); for (ji_i = 0; ji_i < 10000; ji_i++) { bjson = org.hzs.json.JSONObject.d副本(jd_Set.get(ji_i)); } ji截至时间_i = java.util.Calendar.getInstance().getTimeInMillis(); System.out.print("HZS反序列化时间:"); System.out.println(ji截至时间_i - ji起始时间_i); }
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值