C# Newtonsoft.Json解析json笔记

最近在做数据传报的工作,有解析一个巨复杂的json的需求,所以又学了下 Newtonsoft.Json,感觉挺方便的。

参考思路如下:
1、对象的格式为 名称:值。其中,值可以为对象(大括号),也可以为对象数组(中括号),当然更可以简单粗暴的就是文本/数值。对象允许包含子对象。
2、最外层的一对大括号即代表整个json,可以首先用反序列化函数转化为JObject对象,并将其视作根对象;
3、子对象的值,可按名从父对象上摘取。观察值的类型,如果值还是对象则转成JObject;如果是对象数组则转成JAarry(然后对数组中的每个对象分别操作);如果就是最终值,直接ToString。对对象或对象数组直接应用ToString则会得到对应的json文本。(若有必要可以重新parse这个文本为json对象。)

先看个最简单的例子,只有几个并列存在的键值对:
{
    "文件名":"/home/pi/a.jpg",
    "字节数":"123KB"
}

 示例代码(简单起见,忽略了错误处理和对象是否为空的判断。实际使用中建议加上):

string jsonText = "{\"文件名\":\"/home/pi/Pictures/a.jpg\",\"字节数\":\"123KB\"}";

// 解析整段文字作为根对象
JObject jObjRoot = (JObject)JsonConvert.DeserializeObject(jsonText);

Console.WriteLine("===== DEMO 1 ====");
// 从根对象中摘取相应名字,直接显示值
Console.WriteLine(jObjRoot["文件名"].ToString());
Console.WriteLine(jObjRoot["字节数"].ToString());
Console.WriteLine();

输出:
=====【DEMO 1】=====
/home/pi/Pictures/a.jpg
123KB

稍微复杂一点的例子,近似于一种主-从结构:
 {
    "总览":{
        "文件名":"/home/pi/Pictures/a.jpg",
        "字节数":"123KB"
    },
    "EXIF":[
        {"项目":"X 分辨率","值":"2048"},
        {"项目":"Y 分辨率","值":"1536"},
        {"项目":"ISO","值":"100"},
        {"项目":"焦距","值":"55mm"},
        {"项目":"快门速度","值":"1/500"},
        {"项目":"光圈","值":"f/5.6"}
    ]
}

 示例代码:


string jsonText = @"{
	""总览"":{
		""文件名"":""/home/pi/Pictures/a.jpg"",
		""字节数"":""123KB"",
	},
	""EXIF"":[
		{""项目"":""X 分辨率"",""值"":""2048""},
		{""项目"":""Y 分辨率"",""值"":""1536""},
		{""项目"":""ISO"",""值"":""100""},
		{""项目"":""焦距"",""值"":""55mm""},
		{""项目"":""快门速度"",""值"":""1/500""},
		{""项目"":""光圈"",""值"":""f/5.6""},
	]
}";

// 解析整段文字作为根对象
JObject jObjRoot = (JObject)JsonConvert.DeserializeObject(jsonText);
Console.WriteLine("=====【DEMO 2】=====");

// 摘取名为“总览”的节点作为子对象
JObject jObjSummary = (JObject)jObjRoot["总览"];
// 从该子对象中摘取文件名和字节数并显示对应的值
Console.WriteLine(jObjSummary["文件名"].ToString());
Console.WriteLine(jObjSummary["字节数"].ToString());

// 摘取名为“EXIF”的节点作为子对象数组(因包含[])
JArray jArrExif = (JArray)jObjRoot["EXIF"];
foreach(JObject jObjExif in jArrExif)
{
	// 对数组中的每个对象摘取其“项目”和“值”并显示对应的值
	Console.WriteLine(String.Format("项目:{0} - {1}", jObjExif["项目"].ToString(), jObjExif["值"].ToString()));
}

Console.WriteLine();

输出:

=====【DEMO 2】=====
/home/pi/Pictures/a.jpg
123KB
项目:X 分辨率 - 2048
项目:Y 分辨率 - 1536
项目:ISO - 100
项目:焦距 - 55mm
项目:快门速度 - 1/500
项目:光圈 - f/5.6

差不多就是这个套路吧。再多层的话,继续一层层慢慢扒吧。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ki1381

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值