▪ Json.NET 介绍
在做开发的时候,很多数据交换都是以 JSON 格式传输的。而使用 JSON的时候,我们很多时候会涉及到几个序列化对象的使用:DataContractJsonSerializer
,JavaScriptSerializer
和 Json.NET
(或者叫 Newtonsoft.Json
)。这里推荐性能以及通用性较好 Json.NET
,虽然这个不是微软的类库,但是它是一个开源的世界级的 JSON 操作类库,无论是使用便利上还是性能上都非常棒。
▪ Json.NET 安装
因为 Json.NET 是非微软官方类库,所以你需要先去官网下载:http://www.newtonsoft.com/json。
当然,我并不推荐你采用手动去下载并添加引用的这种方式,比较繁琐。你可以直接在 VS 的 ++解决方案资源管理器++ 窗口里,++右击引用++ -> ++管理 NuGet 程序包…++,在左侧弹出的窗口 浏览 里搜索 Newtonsoft.Json
,然后安装即可。
最后在程序头中加入如下代码:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq; // 使用 JArray 和 JObject
▪ Json.NET 使用之字符解析
解析数组型数据
string json = "[{'name':'Jack','age':'25'},{'name':'KeKe','age':'20'}]";
// 数据解析
JArray jarr = JArray.Parse(json); # 方式一
// JArray jarr = (JArray)JsonConvert.DeserializeObject(json); # 方式二
// 数据获取:方式一
MessageBox.Show(jarr[0]["name"].ToString()); // 输出 Jack
MessageBox.Show(jarr[1]["name"].ToString()); // 输出 KeKe
// 数据获取:方式二
JObject jobj = (JObject)jarr[0];
MessageBox.Show(jobj["name"].ToString()); // 输出 Jack
// 数据获取:方式三
foreach( JObject obj in jarr ) MessageBox.Show(obj["name"].ToString()); // 依次输出 Jack,KeKe
注:JArray 只能用来查找索引的项对象,找到对象需要转换为 JObject,再查找对应的属性值
解析对象型数据
string json = "{'man':{'one':'刘德华','two':'张学友'},'woman':{'one':'林心如','two':'苍井空'}}";
// 数据解析:
JObject objs = JObject.Parse(json); # 方式一
// JObject objs = (JObject)JsonConvert.DeserializeObject(json); # 方式二
// 数据获取:方式一
MessageBox.Show(objs["man"]["one"].ToString()); // 输出 刘德华
MessageBox.Show(objs["man"]["two"].ToString()); // 输出 张学友
解析对象型数据(复杂)
string json = "{'error':0, 'users':[{'name':'刘德华','age':'25'},{'one':'林心如','two':'苍井空'}}]";
// 数据解析:
JObject objs = JObject.Parse(json); # 方式一
// JObject objs = (JObject)JsonConvert.DeserializeObject(json); # 方式二
// 数据获取:方式一
MessageBox.Show(objs["man"]["one"].ToString()); // 输出 刘德华
MessageBox.Show(objs["man"]["two"].ToString()); // 输出 张学友
▪ Json.NET 使用之数据序列化
序列化一
JArray jarr = new JArray();
jarr.Add("lengdo");
jarr.Add(new DateTime(2015, 12, 14));
JObject jobj = new JObject();
jobj["index01"] = jarr;
MessageBox.Show(jobj.ToString());
# 输出
/*
{
"index01" : [
"lengdo",
"2015-12-14T00:00:00"
]
}
*/
序列化二
JObject jobj = new JObject
{
{"CPU", "Intel"},
{"Memory", 2048},
{"Drives", new JArray{"DVD","U盘"}}
};
MessageBox.Show(jobj.ToString());
# 输出
/*
{
"CPU" : "Intel",
"Memory" : 2048,
"Drives" : ["DVD", "U盘"]
}
*/
序列化三
JObject jobj = new JObject();
JArray scores = new JArray
{
new JObject{{"subject","语文"}, {"score",99}},
new JObject{{"subject","数学"}, {"score",88}}
};
JArray students = new JArray
{
new JObject{{"name","Mark"}, {"age",8}},
new JObject{{"name","Jack"}, {"age",9}}
};
jobj.Add("scores", scores);
jobj.Add("students", students);
MessageBox.Show(jobj.ToString());
# 输出
/*
{
"scores" : [
{
"subject" : "语文",
"score" : 99
},
{
"subject" : "数学",
"score" : 88
}
],
"students" : [
{
"name" : "Mark",
"age" : 8
},
{
"name" : "Jack",
"age" : 9
}
]
}
*/
序列化四
JObject jobj = new JObject{{"name","Mark"}, {"age","8"}};
JArray results = new JArray
{
new JObject{{"subject","语文"}, {"score",99}},
new JObject{{"subject","数学"}, {"score",88}}
};
jobj.Add("results", results);
MessageBox.Show(jobj.ToString());
# 输出
/*
{
"name" : "Mark",
"age" : "8",
"results" : [
{
"subject" : "语文",
"score" : 99
},
{
"subject" : "数学",
"score" : 88
}
]
}
*/