c#: Newtonsoft.Json 高级用法一(不创建类,动态解析和构造json、JObject/JArray)

本文主要是介绍c#: Newtonsoft.Json 高级用法一(不创建类,动态解析和构造json、JObject/JArray),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

环境:

  • .net core3.1
  • vs2019
  • Newtonsoft.Json 12.0.3

关于newtonsoft.json的使用常见问题参考:
《c#:序列化json常见问题及处理方法》
《c#:关于NewtonsoftJson序列化和Grpc序列化的冲突问题》

问题:如何在不新建类的情况下动态解析json字符串?

如下面:

{"Color": {"Red": 0.8,"Blue": 1.2},"Category": {"Better": [ 99, 98, 100, 96 ],"Normal": [ 80, 75, 84 ]}
}

问: 为什么不能使用指定的类进行反序列化?
答: json中的格式不能完全确定,可能是为将来保留,或者是供别人使用,而自己只负责读写其中的一块,如:“$.Color”

下面的代码就演示如何动态解析这个json字符串:

static void TestReadJson()
{var json = @"
{""Color"": {""Red"": 0.8,""Blue"": 1.2},""Category"": {""Better"": [ 99, 98, 100, 96 ],""Normal"": [ 80, 75, 84 ]}
}";JObject obj = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(json);//color_red=0.8var color_red = obj["Color"]["Red"].Value<decimal>();//color_blue=1.2var color_blue = obj["Color"]["Blue"].Value<double>();//other ==null truevar other = obj["Color:NotExsit"];Console.WriteLine($"other==null => {other == null}");//d = 99var d = obj["Category"]["Better"][0].Value<int>();//遍历所有属性var propNameList = new List<string>();var propValueList = new List<double>();var props = (obj["Color"] as JObject).Properties();foreach (var prop in props){propNameList.Add(prop.Name);propValueList.Add(prop.Value.Value<double>());}//propNameList=Red,Blue//propValueList=0.8,1.2//遍历数组所有元素var values = new List<int>();var arr = obj["Category"]["Better"] as JArray;foreach (var item in arr){values.Add(item.Value<int>());}//values=99, 98, 100, 96
}

问题: 如何在不新建类的情况下动态组装json?

上面只说了动态解析,那么还有动态组装json的情况,如下面的json:

{"Color": {"Red": 0.8,"Blue": 1.2},"Category": {"Better": [ 99, 98, 100, 96 ],"Normal": [ 80, 75, 84 ],"Bad": [undefined,null]}
}

看下面的代码:

static void TestCreateJson()
{/* 手动组装json{"Color": {"Red": 0.8,"Blue": 1.2},"Category": {"Better": [ 99, 98, 100, 96 ],"Normal": [ 80, 75, 84 ],"Bad": [undefined,null]}}*///写入JObject//创建json字符串根节点var obj = new JObject(); //{}//Color节点obj["Color"] = new JObject();// { "Color" : {} }obj["Color"]["Red"] = 0.8;// { "Color" : { "Red" : 0.8  } }obj["Color"]["Blue"] = 1.2;// { "Color" : { "Red" : 0.8 , "Blue" : 1.2 } }//Category节点obj["Category"] = new JObject();// { "Color" : { "Red" : 0.8 , "Blue" : 1.2 }, "Category": {} }//Category->Better数组obj["Category"]["Better"] = new JArray();(obj["Category"]["Better"] as JArray).Add(99);(obj["Category"]["Better"] as JArray).Add(98);(obj["Category"]["Better"] as JArray).Add(100);(obj["Category"]["Better"] as JArray).Add(96); //{ "Color" : { "Red" : 0.8 , "Blue" : 1.2 }, "Category": { “Better”: [99, 98, 100, 96] } }//Category->Normal数组obj["Category"]["Normal"] = new JArray();(obj["Category"]["Normal"] as JArray).Add(80);(obj["Category"]["Normal"] as JArray).Add(75);(obj["Category"]["Normal"] as JArray).Add(84);//{ "Color" : { "Red" : 0.8 , "Blue" : 1.2 }, "Category": { “Better”: [99, 98, 100, 96], “Normal”: [80, 75, 84] } }//Category->Bad数组obj["Category"]["Bad"] = new JArray();(obj["Category"]["Bad"] as JArray).Add(JValue.CreateUndefined());(obj["Category"]["Bad"] as JArray).Add(JValue.CreateNull());//{ "Color" : { "Red" : 0.8 , "Blue" : 1.2 }, "Category": { “Better”: [99, 98, 100, 96], “Normal”: [80, 75, 84], "Bad": [ undefined, null ] } }//输出jsonvar jsonStr = obj.ToString();
}

问题: 如何在不新建类的情况下改写json?

既然上面有了动态解析和组装,那么就有改写部分json的需求,看如下代码:

static void TestUpdateJson()
{var json = @"
{""Color"": {""Red"": 0.8,""Blue"": 1.2},""Category"": {""Better"": [ 99, 98, 100, 96 ],""Normal"": [ 80, 75, 84 ],""Bad"": [undefined,null]}
}";var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(json);obj["Color"] = "Red,Blue";obj["Category"]["Better"][0] = 100;obj["Category"]["Normal"][0] = new JObject();json = obj.ToString();/*{"Color": "Red,Blue","Category": {"Better": [100,98,100,96],"Normal": [{},75,84],"Bad": [null,null]}}*/
}

问题: 如何动态删除json里的内容?

直接看代码:

static void TestDeleteJson()
{var json = @"
{""Color"": {""Red"": 0.8,""Blue"": 1.2},""Category"": {""Better"": [ 99, 98, 100, 96 ],""Normal"": [ 80, 75, 84 ],""Bad"": [undefined,null]}
}";//移除属性和数组元素var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(json);(obj["Color"] as JObject).Remove("Red");(obj["Category"] as JObject).Remove("Better");obj["Category"]["Normal"][0].Remove();json = obj.ToString();/*{"Color": {"Blue": 1.2},"Category": {"Normal": [80,75,84],"Bad": [null,null]}}*/
}

问题:用考虑json文件中的注释吗?

用!!!
因为,我们现在是将json读取到JArray/JObject,Newtonsoft.Json 会将注释一并读取到结构,所以我们要手动排除注释的干扰,具体可参考:
《Newtonsoft.Json 反序列化注意点》

这篇关于c#: Newtonsoft.Json 高级用法一(不创建类,动态解析和构造json、JObject/JArray)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/992564

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识