zoukankan      html  css  js  c++  java
  • 使用System.Text.Json处理Json文档以及部分坑

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

    JsonDocument代表一个Json文档,JsonElement就是Json的元素集合。

    处理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());//写入一个属性   i++;
                } }
    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_1":"b"}]

    存在的坑!!

    非英文的字符会被转义(前端爆炸(解决办法https://my.oschina.net/taadis/blog/3111677

    反序列化不支持字段

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

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

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

    
    
  • 相关阅读:
    HashMap源码解析
    如何同时运行两个Tomcat
    Thymeleaf遍历List<Map>和Map<>
    Apache POI详解
    如何管理系统的右键新建菜单
    datatable的dom配置
    如何获取Html的height和width属性(网页宽、高)
    什么是跨域?如何解决跨域问题?
    C# 各类文件扩展名
    C# 接口与抽象类的区别? 什么情景下使用接口,什么情景下使用抽象类?
  • 原文地址:https://www.cnblogs.com/nasha/p/11596371.html
Copyright © 2011-2022 走看看