环境:

  • .net 6.0
  • vs2022

系列篇:
《c#:System.Text.Json 的使用一》
《c#:System.Text.Json 的使用二》
《c#:System.Text.Json 的使用三(从Newtonsoft迁移)》
《c#:System.Text.Json 的使用四(如何忽略[JsonPropertyName])》

参考:
《msdn: How to use a JSON document in System.Text.Json》
c#: Newtonsoft.Json 高级用法一(不创建类,动态解析和构造json、JObject/JArray)

类似 Newtonsoft,在没有实体类的情况下,也可以使用 JsonNode/JsonValue/JsonArray/JsonObject操作json。

它们比对关系:
在这里插入图片描述

一、读取数据

直接看代码:

using System.Text.Json.Nodes;

string jsonString =
@"
{
    ""Name"":""小明"",
    ""Age"":20,
    ""Birth"":""2003-01-01"",
    ""Ext"":{
        ""Addrs"":[""天明路"",null],
        ""Scores"":[95,98,82],
        ""Desc"":""测试""
    }
}
";
JsonNode node = JsonNode.Parse(jsonString)!;

//GetValue 和 强转都可以
var name = node["Name"].GetValue<string>();
var age = (int)node["Age"]!;
var birth = (DateTime)node["Birth"]!;
Console.WriteLine($"name={name},age={age},birth={birth}");

//下探
var desc = (string)node["Ext"]["Desc"]!;
var addr1 = node["Ext"]["Addrs"][0].GetValue<string>();
var addr2 = (string?)node["Ext"]["Addrs"][1];//这里因为本身为null,使用GetValue方法会报错
Console.WriteLine($"desc={desc},addr1={addr1},addr2={addr2}");

//数组访问
foreach (var i in node["Ext"]["Scores"].AsArray())
{
    var score = i.GetValue<float>();
    Console.WriteLine($"score={score}");
}

输出效果
在这里插入图片描述

二、写入数据

直接看代码:

using System.Text.Json.Nodes;

var ageKey = "Age";
var node = new JsonObject
{
    ["Name"] = "小明",
    [ageKey] = 20,
    ["Birth"] = "2003-01-01",
    ["Ext"] = new JsonObject
    {
        ["Addrs"] = new JsonArray("天明路", null),
        ["Desc"] = "测试",
    }
};
node["Ext"]["Desc"] = new JsonArray(95, 98);
node["Ext"]["Desc"].AsArray().Add(82);
Console.WriteLine(node.ToJsonString(new System.Text.Json.JsonSerializerOptions
{
    Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
    WriteIndented = true,
}));
Console.WriteLine("ok");

输出效果:
在这里插入图片描述

三、关于 JsonDocument

上面的JsonNode/JsonObject等基本够用,JsonDocument主要为性能考虑,并且限制只读,使用时记得 Dispose!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐