1. 程式人生 > >使用System.Text.Json處理Json文件以及部分坑

使用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());//寫入一個屬性
                    }
                }
                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("a