System.Text.Json处理Json文档需要用到JsonDocument,JsonElement,JsonProperty。

JsonDocument就是一个表示Json文档的东西,JsonElement相当于光标。

处理Json文档时基本是对JsonElement和JsonProperty操作,JsonElement可以获取到JsonProperty,而JsonProperty的Value也是一个JsonElement,具体Api可以自行F12。

要处理Json文档我们需要获取一个JsonDocument

var @objet = new { a1 = "123", a2 = 1, a3 = new string[] { "a", "b" } };
var json = JsonSerializer.Serialize(@objet);
using JsonDocument jsondocument = JsonDocument.Parse(json);

然后获取JsonElement

JsonElement jsonElement = jsondocument.RootElement;

获取a1的值

JsonElement a1 = jsonElement.GetProperty("a1");

需要注意的是属性名区分大小写,想要不区分大小写就要上Linq了,JsonElement有2个获取IEnumerator的方法EnumerateArray和EnumerateObject,看名称就知道一个处理数组一个处理对象。

JsonProperty A1= jsonElement.EnumerateObject().FirstOrDefault(c => c.Name.Equals("A1", StringComparison.OrdinalIgnoreCase));

有时候我们可能想要编辑一个Json文档,但是JsonDocument目前并不支持编辑,难道没有其他办法了嘛?当然有…

            ArrayBufferWriter<byte> Jsonbyte = new ArrayBufferWriter<byte>();//一个接收器
            using var JArrayList = new Utf8JsonWriter(Jsonbyte);//编写器

            JArrayList.WriteStartArray();//开始写入数组
            foreach (JsonProperty jsonProperty in jsondocument.RootElement.EnumerateObject())
            {
                JArrayList.WriteStartObject();//开始写入一个对象
                if (jsonProperty.Value.ValueKind is JsonValueKind.Array)
                {
                    int i = 0;
                    foreach (JsonElement element in jsonProperty.Value.EnumerateArray())
                    {
                        JArrayList.WriteString($"{jsonProperty.Name}_{i}", element.ToString());//写入一个属性
                    }
                }
                else
                {
                    jsonProperty.WriteTo(JArrayList);//当前属性直接写入
                }
                JArrayList.WriteEndObject();//
            }
            JArrayList.WriteEndArray();

            JArrayList.Flush();

           using JsonDocument document2 = JsonDocument.Parse(Jsonbyte.WrittenMemory);
           var json2= document2.RootElement.ToString();
      //输出:[{"a1":"123"},{"a2":1},{"a3_0":"a","a3_0":"b"}]

 

存在的坑!!

非英文的字符会被转义(前端爆炸

反序列化不支持字段

复杂类型不支持,如下类型

JsonSerializer.Serialize(new XElement("Key",new XElement(" vv.")));
JsonSerializer.Serialize(new DataTable());

以及Dapper.QueryAsync<object>()等返回的objet(DapperRow).


JsonElement a1 = jsonElement.GetProperty(“a1”);

版权声明:本文为nasha原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/nasha/p/11596371.html