上一篇JSON博客《JSON入门级学习小结--JSON数据结构》中已对JSON做了简单介绍,JSON字符串数组数据样式大概是这样子的:
如今因为项目需求(asp.net web网站,前台向后台传递JSON数据,并对JSON数据处理,详述见博客《
使用Newtonsoft.Json.dll反序列化JSON字符串的步骤:
将Newtonsoft.Json.dll文件拷贝至界面层的Bin目录下,然后右击Bin,弹出“添加引用”页,然后点击“浏览”,然后找到界面层的Bin文件夹,找到Newtonsoft.Json.dll文件,然后点击"添加",引用添加成功!
网上解决办法大致如下:
方法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字符串的方法
//引用序列化、反序列化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.1 添加一个类,定义一个对象
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
///
///Customer 的摘要说明
///
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 _list = JsonConvert.DeserializeObject>(jsonText);
//读取列表中的值
Console.WriteLine(_list[1].a);
foreach (Customer c in _list)
{
Console.WriteLine(c.c);
}