请先阅读 JSON数据交换格式

Json数据交换格式 对应C#类

System.Text.Json.Nodes:.NET 6

依微软的计划,System.Text.Json 应取代Newtonsoft.Json(Json.NET),成为 .NET Core/.NET 5+ 奥林匹克指定 JSON 程式库。System.Text.Json 主打轻巧高效能,但毕竟发展时间尚短,与身经百战的老将 Json.NET 相比,在功能完整性及可扩充性上仍有点“嫩”。其中我觉得最不便的地方是缺少像 Json.NET 一样的 JObjec/JArray 物件模型,无法动态巡览 JSON 属性或修改内容,更甭提整合 dynamic 动态型别的花式应用。

好消息! .NET 6 起,System.Text.Json 补强了这段,加入 JsonNode、JsonObject、JsonArray、JsonValue 等型别,对映到 Json.NET 的 JToken、JObject、JArray、JValue,允许开发者以物件模型方式建构 JSON 文件,或是将 JSON 文件转为物件资料结构,进行增删修改或属性巡览,有了这项武器,处理 JSON 文件就更方便了。

writeable DOM

. net 6提供了处理内存中可写文档对象模型(DOM)的类型,用于在数据的结构化视图中随机访问JSON元素。

对于新增操作我们可以使用JsonObject类和JsonArray类去创建JSON DOM:

  • JsonObject:表示创建JSON对象;
  • JsonArray:表示创建JSON数组。

主要的 API 如下:

  • JsonNode: JSON 文档中的一个节点,对应 Newtonsoft.Json 里的 JToken,内部有字典字段
  • JsonObject: JSON 对象继承自JsonNode,对应 Newtonsoft.Json 里的 JObject是字典结构继承了JsonValue、ICollection、IDictionary、IEnumerable。
  • JsonArray: JSON 数组继承自JsonNode,对应 Newtonsoft.Json 里的 JArray,是list结构继承了JsonValue、ICollection、IList、IEnumerable。
  • JsonValue: JSON 中的一个值继承自JsonNode,对应 Newtonsoft.Json 里的 JValue 继承了IEnumerable。

JsonNode用法

案例一

生成、获取JsonNode子节点、以及属性的值

你可以使用 JsonNode.Parse("") 来将一个 JSON 转换成一个 JsonNode 对象,可以看下面的示例:

using System.Text.Json;
using System.Text.Json.Nodes; //生成JsonNode节点
JsonNode JObjectNode = JsonNode.Parse(@"{""ShangHai"":""42""}")!;//将string 解析为JsonNode
JsonObject JObject = JObjectNode.AsObject()!;//JsonNode 转化为Object对象 //解析并且转化成JsonArray
JsonArray JArray = JsonNode.Parse(@"[{""HangZhou"":52},{""MyProperty"":true}]")!.AsArray(); //获取值子节点
JsonNode sun = JArray[1];
Console.WriteLine($"Parent Node:{sun.Parent}");
Console.WriteLine($"Root Node:{sun.Root}");
Console.WriteLine($"JsonNodeOptions:{sun.Options}");
Console.WriteLine(sun.ToJsonString()); //获取节点的值
Console.WriteLine(JObject["ShangHai"]!.GetValue<string>());
//OR
string value = (string)JObject["ShangHai"]!;
Console.WriteLine(value); Console.WriteLine(JArray[1]!["MyProperty"]!.GetValue<bool>());

案例二

//获取天气
HttpClient hc=new HttpClient();
string joson = await hc.GetStringAsync("http://www.weather.com.cn/data/sk/101010100.html");
var weather=JsonNode.Parse(joson);
string city=weather["weatherinfo"]["city"].ToJsonString();
Console.WriteLine(city);
Console.Read();

案例三、

使用对象初始值设定项创建 JsonNode DOM 并进行更改

以下示例介绍如何:

  • 使用对象初始值设定项创建 DOM。
  • 对 DOM 进行更改。
using System.Text.Json;
using System.Text.Json.Nodes;
//新增操作
JsonObject jo = new JsonObject
{
//JsonObject继承JsonNode ,JsonNode内部有字典和索引(索引会生成一个node)。字典初始值设定项
["Message"] = "个人信息",
["Father"] = new JsonObject { ["Name"] = "张三" },
["Son"] = new JsonArray(
//JsonArray 内部有一个list和Add()方法。 JsonArray列表初始化设定项
new JsonObject
{
["Name"] = "张小小",
["Pet"] = new JsonArray("小花狗", "小花猫"),
["Age"] = ""
},
new JsonObject
{
["Name"] = "张大大",
["Pet"] = new JsonArray("小狼狗", "小公鸡"),
["Age"] = 2
})
};
string jsonString = jo.ToJsonString(new JsonSerializerOptions { WriteIndented = true });
var njo = JsonNode.Parse(jsonString);
Console.WriteLine(jsonString); //查询操作 Console.WriteLine(njo["Son"][1]["Name"]!);////运行后输出 “张大大” //修改操作
njo["Message"] = "zhagnxiaoxiao"; //当然,我们不仅能改还可以给节点增加属性和新的节点: //增加新节点
njo["SearchDate"] = new JsonObject { ["UTC"] = "2021/12/1 00:00:00", ["UTC8"] = "2021/12/ 08:00:00" };
Console.WriteLine(njo.ToJsonString(new JsonSerializerOptions { WriteIndented = true }));
Console.Read();
//删除操作 对于删除,.NET6并没有提供删除节点的方法,但我们可以使用一个变通的方法来实现,就是通过将节点设为null,序列化时忽略,代码如下:
njo["SearchDate"] = null; Console.WriteLine(njo.ToJsonString(new JsonSerializerOptions { WriteIndented = true }));
//写入流
using MemoryStream ms=new MemoryStream();
Utf8JsonWriter writer = new Utf8JsonWriter(ms);
jo.WriteTo(writer);
writer.Flush();
var jsonString2 = ms.ToArray();

JsonObject用法

using System.Text.Json;
using System.Text.Json.Nodes; //生成JsonNode节点
JsonNode JObjectNode = System.Text.Json.Nodes.JsonNode.Parse(@"{""ShangHai"":42,""HangZhou"":23}")!;//将string 解析为JsonNode #region 新建一个JsonObject 对象 多种方法
JsonObject JObject = JObjectNode.AsObject()!;//JsonNode 转化为Object对象 // 方式1
JsonObject JObject1 = new();
JObject["JiangSu"] = 54;
JObject["ShangHai"] = 32;
JObject["HangZhou"] = 44; //or 方式2 依赖于Add方法
JsonObject JObject2 = new (){ ["ShangHai"] = 42, ["HangZhou"] = 23 };//依赖与Add方法 //or 方式3 依赖于Add方法
JsonObject JObject3 = new();
JObject.Add(KeyValuePair.Create<string, JsonNode>("name3", "value3"!)!);
JObject.Add("name4", "value4"); //or 方式4 索引
JsonObject JObject4 = new JsonObject(
new[]
{
KeyValuePair.Create<string, JsonNode?>("name1", "value1"),
KeyValuePair.Create<string, JsonNode?>("name2", 2),
}
); //or 方式5 索引
var dictionary = new Dictionary<string, JsonNode>
{
["name1"] = "value1"!,
["name2"] = 2
}; JsonObject JObject5 = new JsonObject(dictionary!); #endregion //添加Json属性 JObject.Add("BeJing", 23);
//or
JObject["YunNan"] = new JsonArray
{
new JsonObject{["Name"] = "Spot"},
new JsonObject{["Exp"] = 255},
new JsonObject{["Exp1"] = 257},
};
//or
JObject["KunMing"] = new JsonArray("Shield", "Sword", "Bottle");
//or Console.Clear();
Console.WriteLine("添加3个属性");
Console.WriteLine(JObject.ToJsonString(new JsonSerializerOptions() { WriteIndented=true}));
Console.Read(); Console.WriteLine(JObject.ContainsKey("BeJing"));//是否包含属性
Console.WriteLine(JObject.Count);//对象中属性的个数 Console.WriteLine(JObject["ShangHai"]!.GetValue<int>()); //删除属性
JObject.Remove("ShangHai");
//or
var array = JObject["YunNan"]!.AsArray(); //https://blog.darkthread.net/blog/system-text-json-writable-dom/
//array.Remove(array.Single(o => o?.GetValue<string>() == "Bottle"));
//or
var itme = array.Single(o => o.AsObject().ContainsKey("Exp"));
array.Remove(itme);
Console.WriteLine("移除后的数组");
Console.WriteLine(array.ToJsonString(new JsonSerializerOptions() { WriteIndented = true }));
Console.WriteLine("移除后的对象");
Console.WriteLine(JObject.ToJsonString(new JsonSerializerOptions() { WriteIndented = true })); Console.Read();
//读取
string HangZhou = (string)JObject["HangZhou"]!;
string YunNan = (string)JObject["YunNan"]![1]!;
JObject["HangZhou"]!.GetValue<string>(); //JsonObject.GetEnumerator
var enumerator=JObject.GetEnumerator();
while (enumerator.MoveNext())
{
var current=enumerator.Current;
Console.WriteLine(current.Key);
} //JsonObject.TryGetPropertyValue
JsonNode jnode = new JsonArray() ;
if(JObject.TryGetPropertyValue("YunNan", out jnode))
{
Console.WriteLine(true);
}; JObject.Clear();//清空字典

JsonArray用法

using System.Text.Json;
using System.Text.Json.Nodes; JsonNode obJsonNode= JsonValue.Create("Beijing") ;
JsonNode obJsonNode2 = JsonValue.Create("Toamkomg"); JsonArray jsonArray =new JsonArray {"shanghai","jiangsu" };
jsonArray.Add("yunan");
jsonArray.Add("jiangsu");
jsonArray.Add(obJsonNode);
jsonArray.Insert(0,obJsonNode2);
Console.WriteLine(jsonArray.Contains(obJsonNode));
Console.WriteLine(jsonArray.IndexOf(obJsonNode));
Console.WriteLine(jsonArray.Count);
Console.WriteLine(jsonArray.ToJsonString(new JsonSerializerOptions {PropertyNameCaseInsensitive=true}));
jsonArray.Remove(obJsonNode);
Console.WriteLine(jsonArray.ToJsonString(new JsonSerializerOptions { PropertyNameCaseInsensitive = true }));
jsonArray.RemoveAt(0);
Console.WriteLine(jsonArray.ToJsonString(new JsonSerializerOptions { PropertyNameCaseInsensitive = true }));

JsonValue.Create用法

System.Text.Json

该命名空间自 2019 年 9 月以来一直存在,但是,只有最近发布的 .NET 6(2021 年 11 月)包含了一种使用 创建和操作 JSON 的方法。System.Text.JsonJsonNode

一个常见的替代方案是使用 ,这是Newtonsoft Json.NET 的一部分,可以在许多.NET项目中看到。JTokenJObjectJArrayJValue

解析Json数据

string data = @" [ {""name"": ""John Doe"",""occupation"": ""gardener""},
{""name"": ""Peter Novak"", ""occupation"": ""driver""} ]";
//文档解析配置
JsonDocumentOptions jdo=new(){ AllowTrailingCommas=true, CommentHandling= JsonCommentHandling.Skip }; JsonDocument? jscon= JsonDocument.Parse(data);
JsonElement je = jscon.RootElement;
if (je.ValueKind == JsonValueKind.Array)
{
JsonElement.ArrayEnumerator enumerateArray = je.EnumerateArray();
JsonElement.ArrayEnumerator users = enumerateArray.GetEnumerator();
while (users.MoveNext())
{
var use = users.Current;
Console.WriteLine(use.GetProperty("name")); } }

使用Utf8JsonWriter编写原始JSON

. net 6引入了使用System.Text.Json.Utf8JsonWriter编写原始JSON的可能性。

using System.Text.Json;
using System.Text.Json.Nodes; namespace JsonNodePOCOExample; public class TemperatureRanges : Dictionary<string, HighLowTemps>
{
} public class HighLowTemps
{
public int High { get; set; }
public int Low { get; set; }
} public class Program
{
public static DateTime[]? DatesAvailable { get; set; } public static void Main()
{
string jsonString =
@"{
""Date"": ""2019-08-01T00:00:00"",
""Temperature"": 25,
""Summary"": ""Hot"",
""DatesAvailable"": [
""2019-08-01T00:00:00"",
""2019-08-02T00:00:00""
],
""TemperatureRanges"": {
""Cold"": {
""High"": 20,
""Low"": -10
},
""Hot"": {
""High"": 60,
""Low"": 20
}
}
}
";
// Parse all of the JSON.
JsonNode forecastNode = JsonNode.Parse(jsonString)!; // Get a single value
int hotHigh = forecastNode["TemperatureRanges"]!["Hot"]!["High"]!.GetValue<int>();
Console.WriteLine($"Hot.High={hotHigh}");
// output:
//Hot.High=60 // Get a subsection and deserialize it into a custom type.
JsonObject temperatureRangesObject = forecastNode!["TemperatureRanges"]!.AsObject();
using var stream = new MemoryStream();
using var writer = new Utf8JsonWriter(stream);
temperatureRangesObject.WriteTo(writer);
writer.Flush();
TemperatureRanges? temperatureRanges =
JsonSerializer.Deserialize<TemperatureRanges>(stream.ToArray());
Console.WriteLine($"Cold.Low={temperatureRanges!["Cold"].Low}, Hot.High={temperatureRanges["Hot"].High}");
// output:
//Cold.Low=-10, Hot.High=60 // Get a subsection and deserialize it into an array.
JsonArray datesAvailable = forecastNode!["DatesAvailable"]!.AsArray()!;
Console.WriteLine($"DatesAvailable[0]={datesAvailable[0]}");
// output:
//DatesAvailable[0]=8/1/2019 12:00:00 AM
}
}
 

【C# 序列化】System.Text.Json.Nodes ---Json数据交换格式 对应C#类的更多相关文章

  1. 二维码与json都是数据交换格式

    二维码与json都是数据交换格式: UI数据是人机数据交换格式.

  2. JQuery + JSON作为前后台数据交换格式实践

    JQuery + JSON作为前后台数据交换 JQuery提供良好的异步加载接口AJAX,可以局部更新页面数据, http://api.jquery.com/category/ajax/ JSON作为 ...

  3. XML和JSON两种数据交换格式的比较

    在web开发领域,主要的数据交换格式有XML和JSON,对于在 Ajax开发中,是选择XML还是JSON,一直存在着争议,个人还是比较倾向于JSON的.一般都输出Json不输出xml,原因就是因为 x ...

  4. 【学习】006数据交换格式与SpringIOC底层实现

    课程目标 XML和JSON Java反射机制 手写SpringIOC 什么是数据交换格式 客户端与服务器常用数据交换格式xml.json.html 数据交换格式用场景 移动端(安卓.IOS)通讯方式采 ...

  5. 在.NET使用JSON作为数据交换格式

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhoufoxcn.blog.51cto.com/792419/517093 我们 ...

  6. Java 常见数据交换格式——xml、json、yaml

    目录 数据交换格式介绍 XML 使用DOM方式解析 使用SAX方式解析 使用DOM4J方式解析 使用JDOM方式解析 JSON 使用JSONObject方式将数据转换为JSON格式 利用JSONObj ...

  7. 在.NET使用JSON作为数据交换格式【转】

    http://www.cnblogs.com/zhoufoxcn/archive/2011/03/16/2515611.html 我们知道在.NET中我们有多种对象序列化的方式,如XML方式序列化.B ...

  8. JSON——IT技术人员都必须要了解的一种数据交换格式

    JSON作为目前Web主流的数据交换格式,是每个IT技术人员都必须要了解的一种数据交换格式.尤其是在Ajax和REST技术的大行其道的当今,JSON无疑成为了数据交换格式的首选! 今天大家就和猪哥一起 ...

  9. json 数据交换格式与java

    http://wiki.mbalib.com/wiki/数据交换 数据交换是指为了满足不同信息系统之间数据资源的共享需要,依据一定的原则,采取相应的技术,实现不同信息系统之间数据资源共享的过程. 数据 ...

  10. Android之使用json进行网络数据交换

    JSON作为一种轻量级的数据交换格式,凭借其易于阅读和编写.易于解析.传输速度快等优点流行了起来.最近正好在学习Android端从服务端端取数据,Json便派上了用场.好,下面开始切入主题. 1.准备 ...

随机推荐

  1. ASP.NET 部署常见问题及解决方案

    ASP.NET 部署部署过程中常见问题及解决方案 Could not load file or assembly 'XXXXX' or one of its dependencies. Access ...

  2. Excel 分组后计算

    分组后的计算都类似,仍然采用 groups 函数,分组并同时计算出各洲的 GDP 总量,然后再求一遍各洲的 GDP 总量占全球 GDP 的百分比值. SPL 代码如下:   A B 1 =clipbo ...

  3. 抓包整理————wireshark DNS 演练[三]

    前言 简单整理一些wireshark dns 演练. 正文 简单介绍一下什么是dns. 这个其实可以百度一下哈,其实就是将域名转换为ip. 然后查询过程是这样的: 根域名服务器 权威服务器 dns 被 ...

  4. redis 简单整理——发布与订阅[十四]

    前言 简单介绍一下redis的发布与订阅. 正文 Redis提供了基于"发布/订阅"模式的消息机制,此种模式下,消息发布 者和订阅者不进行直接通信,发布者客户端向指定的频道(cha ...

  5. webpack中常见的Plugin?解决了什么问题?

    一.是什么 Plugin(Plug-in)是一种计算机应用程序,它和主应用程序互相交互,以提供特定的功能 是一种遵循一定规范的应用程序接口编写出来的程序,只能运行在程序规定的系统下,因为其需要调用原纯 ...

  6. vue的history模式与哈希模式原理

    hash模式 <!-- * @Author: dezhao.zhao@hand-china.com * @Date: 2021-10-26 17:52:25 * @Description: -- ...

  7. HarmonyOS NEXT应用开发案例——阻塞事件冒泡

    介绍 本示例主要介绍在点击事件中,子组件enabled属性设置为false的时候,如何解决点击子组件模块区域会触发父组件的点击事件问题:以及触摸事件中当子组件触发触摸事件的时候,父组件如果设置触摸事件 ...

  8. 说说关系型数据库与Serverless

    简介: 看到如今Serverless在云计算行业喷薄欲出的态势,像极了<星星之火,可以燎原>中的描述:虽然不能预测未来的发展和变化,但对于云计算来说这是个相对确定的方向.本文从产业界和学术 ...

  9. 重磅官宣:Nacos2.0发布,性能提升10倍

    简介: ​Nacos2.0 作为一个跨代版本,彻底解决了 Nacos1.X 的性能问题,将性能提升了 10 倍. 作者:席翁 继 Nacos 1.0 发布以来,Nacos 迅速被成千上万家企业采用,并 ...

  10. io_uring vs epoll ,谁在网络编程领域更胜一筹?

    ​简介:从定量分析的角度,通过量化 io_uring 和 epoll 两种编程框架下的相关操作的耗时,来分析二者的性能差异. ​ 本文作者:王小光,「高性能存储技术SIG」核心成员. 背景 io_ur ...