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).