如今因为项目需求(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:
- <SPANstyle="FONT-FAMILY:KaiTi_GB2312;FONT-SIZE:18px">//引用JSON解析使用的空间
- usingNewtonsoft.Json;
- usingSystem.Text;
- //定义一个可变字符串数组
- StringBuildersb=newStringBuilder();
- //定义一个JSON字符串str
- stringstr="[{ID:'1',Name:'John',Other:[{Age:'21',Sex:'0'}]},{ID:'2',Name:'Good',Other:[{Age:'36',Sex:'1'}]}]";
- //反序列化JSON数据
- JavaScriptArrayjavascript=(JavaScriptArray)JavaScriptConvert.DeserializeObject(str);
- //依次读取反序列化的JSON数据,并将各数据写入可变字符串数组中
- for(inti=0;i<javascript.Count;i++)
- {
- //
- JavaScriptObjectobj=(JavaScriptObject)javascript[i];
- //可变字符串数组添加数据
- sb.Append("ID:"+obj["ID"].ToString());
- sb.Append("Name:"+obj["Name"].ToString());
- //反序列化JSON数据
- JavaScriptArrayjson=(JavaScriptArray)obj["Other"];
- //依次读取反序列化的JSON数据,并将各数据写入可变字符串数组中
- for(intj=0;j<json.Count;j++)
- {
- JavaScriptObjectjsonobj=(JavaScriptObject)json[j];
- sb.Append("Age:"+jsonobj["Age"].ToString());
- sb.Append("Sex:"+jsonobj["Sex"].ToString());
- }
- }</SPAN>
//引用JSON解析使用的空间
using Newtonsoft.Json;
using System.Text;
//定义一个可变字符串数组
StringBuilder sb = new StringBuilder();
//定义一个JSON字符串str
string str = "[{ID:'1',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
- stringjsonText="[{'a':'aaa','b':'bbb','c':'ccc'},{'a':'aaa2','b':'bbb2','c':'ccc2'}]";
- //反序列化JSON数据
- JsonReaderreader=newJsonReader(newStringReader(jsonText));
- //依次读取反序列化的JSON数据
- while(reader.Read())
- {
- textBox1.Text+="TokenType="+reader.TokenType+"ValueType="+reader.ValueType+"Value="+reader.Value+"\r\n";
- }
//定义一个JSON字符串str string jsonText = "[{'a':'aaa','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,顺着这个思路,发现变化如下:
- <SPANstyle="FONT-FAMILY:KaiTi_GB2312;FONT-SIZE:18px">JavaScriptArray--->JArray
- JavaScriptConvert--->JsonConvert
- JavaScriptObject--->JObject</SPAN>
JavaScriptArray--->JArray
JavaScriptConvert--->JsonConvert
JavaScriptObject--->JObject
其实这样更改更规范吧!
下面介绍新版本Newtonsoft.Json.dll反序列化JSON字符串的方法
1.直接反序列化JSON字符串
- //引用序列化、反序列化JSON字符串用到的空间
- usingNewtonsoft.Json;
- usingNewtonsoft.Json.Linq;
- //定义一个JSON字符串
- stringjsonText="[{'a':'aaa','c':'ccc2'}]";
- //反序列化JSON字符串
- JArrayja=(JArray)JsonConvert.DeserializeObject(jsonText);
- //将反序列化的JSON字符串转换成对象
- JObjecto=(JObject)ja[1];
- //读取对象中的各项值
- Console.WriteLine(o["a"]);
- Console.WriteLine(ja[1]["a"]);
//引用序列化、反序列化JSON字符串用到的空间 using Newtonsoft.Json; using Newtonsoft.Json.Linq; //定义一个JSON字符串 string jsonText = "[{'a':'aaa','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 添加一个类,定义一个对象
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Web;
- ///<summary>
- ///Customer的摘要说明
- ///</summary>
- publicclassCustomer
- {
- //在序列化前后没有变动
- publicstringa
- {get;set;}
- //在序列化前后设置和重置
- publicstringb
- {get;set;}
- //设置为null,但在序列化后填充
- publicstringc
- {get;set;}
- publicstringOther
- {get;set;}
- publicCustomer()
- {
- //
- //TODO:在此处添加构造函数逻辑
- //
- a="";
- b="";
- c="";
- Other=null;
- }
- }
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字符串用到的空间
- usingNewtonsoft.Json;
- usingNewtonsoft.Json.Linq;
- //定义一个JSON字符串
- stringjsonText="[{'a':'aaa','c':'ccc2'}]";
- //反序列化JSON字符串,将JSON字符串转换成LIST列表
- List<Customer>_list=JsonConvert.DeserializeObject<List<Customer>>(jsonText);
- //读取列表中的值
- Console.WriteLine(_list[1].a);
- foreach(Customercin_list)
- {
- Console.WriteLine(c.c);
- }
//引用序列化、反序列化JSON字符串用到的空间 using Newtonsoft.Json; using Newtonsoft.Json.Linq; //定义一个JSON字符串 string jsonText = "[{'a':'aaa','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这个工具! 原文链接:https://www.f2er.com/json/290272.html