欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C# 处理 JSON 之 Json.NET 库

程序员文章站 2022-06-13 21:15:49
...

▪ Json.NET 介绍

在做开发的时候,很多数据交换都是以 JSON 格式传输的。而使用 JSON的时候,我们很多时候会涉及到几个序列化对象的使用:DataContractJsonSerializerJavaScriptSerializerJson.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
        }
    ]
}
*/