使用System.Text.Json处理Json文档以及部分坑
程序员文章站
2022-06-20 18:26:39
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).
上一篇: 曲苑杂坛