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 = "", a2 = , 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 = ;
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).

												

最新文章

  1. 1282 - Leading and Trailing ---LightOj1282(快速幂 + 数学)
  2. 魔改——MFC MDI程序 定制 文档模板 运行时全部打开 禁用关闭按钮
  3. pytest学习笔记(二)
  4. ASP.Net MVC 5 高级编程 第7章 成员资格、授权和安全性
  5. RFID FDX HDX Technology
  6. zigbee智能家居基础扫盲
  7. HDOJ --- 2084数塔
  8. 【转】到底EJB是什么
  9. python construct文档
  10. [HNOI 2005]狡猾的商人
  11. iframe跨域解决方案
  12. java课堂笔记2
  13. Android 异步下载
  14. js 窗口滚动到一定高度时加载数据
  15. android中用studio更改包名
  16. laravel中数据库迁移的使用:
  17. 无法加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项
  18. Jni中图片传递的3种方式(转)
  19. 概率DP入门学习QAQ
  20. Java死锁举例

热门文章

  1. v语言怎么玩
  2. Keras实例教程(1)
  3. 装饰器修复技术@wraps
  4. HDU 6040
  5. Javaweb简介
  6. [Python] 通过采集23万条数据,对《哪吒》影评分析
  7. MSIL实用指南-返回结果
  8. spss数据分析可以被人工智能替换吗
  9. 机器学习性能度量指标:ROC曲线、查准率、查全率、F1
  10. HDU-DuoXiao第二场hdu 6315 Naive Operations 线段树