System.Text.Json處理Json文檔需要用到JsonDocument,JsonElement,JsonProperty。 JsonDocument代表一個Json文檔,JsonElement就是Json的元素集合。 處理Json文檔時基本是對JsonElement和JsonPropert ...
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).