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

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

2017-09-14 15:01 281 查看
上一篇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:

[csharp] view plain copy

print?

<span style="font-family:KaiTi_GB2312;font-size:18px;">//引用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());

}

} </span>

还有一种方法是:

[csharp] view plain copy

print?

//定义一个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,顺着这个思路,发现变化如下:

[csharp] view plain copy

print?

<span style="font-family:KaiTi_GB2312;font-size:18px;">JavaScriptArray--->JArray

JavaScriptConvert--->JsonConvert

JavaScriptObject--->JObject</span>

其实这样更改更规范吧!

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

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

[csharp] view plain copy

print?

//引用序列化、反序列化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 添加一个类,定义一个对象

[csharp] view plain copy

print?

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字符串

[csharp] view plain copy

print?

//引用序列化、反序列化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这个工具!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: