欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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