环境:
- .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!