c#:System.Text.Json 的使用二

环境:

  • .net 6.0
  • vs2022

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

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

它们比对关系:
c#:System.Text.Json 的使用二_第1张图片

一、读取数据

直接看代码:

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}");
}

输出效果
c#:System.Text.Json 的使用二_第2张图片

二、写入数据

直接看代码:

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");

输出效果:
c#:System.Text.Json 的使用二_第3张图片

三、关于 JsonDocument

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

你可能感兴趣的:(.netcore,c#,c#,json,.net)