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

												

使用System.Text.Json处理Json文档以及部分坑的更多相关文章

  1. 在项目中利用TX Text Control进行WORD文档的编辑显示处理

    在很多文档管理的功能模块里面,我们往往需要对WORD稳定进行展示.编辑等处理,而如果使用微软word控件进行处理,需要安装WORD组件,而且接口使用也不见得简单易用,因此如果有第三方且不用安装Offi ...

  2. JSON方式提交文档时SOLR报:AtomicUpdateDocumentMerger Unknown operation for the an atomic update, operation ignored

    文档是数组转成的json 原数组: array( 0 =>3, 1 =>3, 2 =>4, 3 =>5, 4 =>5, 5 =>6) 用array_unique去掉 ...

  3. CI 笔记,使用 json的参考文档(废弃)

    Json的处理转换, Json转换步骤, a)         先设置json为空字符串, b)         While循环,遍历, While(!!$row = mysql_fetch_arra ...

  4. RESTful API接口文档规范小坑

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 前后端分离的开发模式,假如使用的是基于RESTful API的七层通讯协议,在联调的时候,如何避免配合过程中出现问 ...

  5. elasticsearch 第五篇(文档操作接口)

    INDEX API 示例: 1 2 3 4 5 PUT /test/user/1 { "name": "silence", "age": 2 ...

  6. mongoDB文档操作【增删改】

    MongoDB 插入文档 文档的数据结构和JSON基本一样. 所有存储在集合中的数据都是BSON格式. BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON. 插入文档 Mo ...

  7. elasticsearch——海量文档高性能索引系统

    elasticsearch elasticsearch是一个高性能高扩展性的索引系统,底层基于apache lucene. 可结合kibana工具进行可视化. 概念: index 索引: 类似SQL中 ...

  8. 关于Elasticsearch文档的描述以及如何操作文档的详细总结

    文档 什么是文档 在大多数应用中,多数实体或对象可以被序列化为包含键值对的 JSON 对象. 一个 键 可以是一个字段或字段的名称,一个 值 可以是一个字符串,一个数字,一个布尔值, 另一个对象,一些 ...

  9. Elasticsearch 7.x 之文档、索引和 REST API 【基础入门篇】

    前几天写过一篇<Elasticsearch 7.x 最详细安装及配置>,今天继续最新版基础入门内容.这一篇简单总结了 Elasticsearch 7.x 之文档.索引和 REST API. ...

随机推荐

  1. TensorFlow Object Detection API 迁移学习

    https://blog.csdn.net/ctwy291314/article/details/80999645 https://www.cnblogs.com/gmhappy/p/9472361. ...

  2. Linux--进程管理--06

    1.操作系统的基础 调用:kernel通过给应用程序提供system call的方式来提供硬件资源: 注意:应用程序也包括库文件 库文件是运行在ring0上的一段程序代码,不对客户直接提供应用 2.程 ...

  3. sql server创建序列sequence

    1.创建一个序列对象 CREATE SEQUENCE [schema_name . ] sequence_name START WITH <constant> INCREMENT BY & ...

  4. SpringMVC整合Apache Shiro

    关于什么是Shiro,可以查看这篇文章http://www.cnblogs.com/Laymen/articles/6117751.html 一.添加maven依赖 <dependency> ...

  5. WebStorm调节控制台字体

    File --> Settings --> Editor --> Colors & Fonts --> Console Font

  6. 基于 KubeSphere CI/CD 将 Spring Boot 项目发布至 Kubernetes

    本示例基于开源的 KubeSphere 容器平台 演示如何通过 GitHub 仓库中的 Jenkinsfile 来创建流水线,流水线共包括 8 个阶段,最终将一个 Hello World 页面部署到 ...

  7. 在React中使用Bootstrap

    这几天想在react中用一下bootstrap,尽管有一个适配react的很好的库叫react-bootstrap,但我还是想直接使用bootstrap 可以在react项目中执行以下命令安装boot ...

  8. volatile的工作原理

    volatile的特性: volatile可见性:对一个volatile的读,总可以看到对这个变量最终的写: volatile原子性:volatile对单个读/写具有原子性(32位Long.Doubl ...

  9. asp.net core 使用 NLog日志

    NLog是一个配置灵活的日志记录类库,拥有输出日志到文件.存储入库.发送到udp地址的高级功能 1 添加 nlog nuget包 Nlog和NLog.Web.AspNetCore 安装完成后   2 ...

  10. Android开发:为什么我们从来不去感谢开源项目维护者?

    今天我想谈一谈,为什么我们很少去感谢开源项目维护者: 一.这样的项目我也可以做啊 “蛤?这项目对我来说也太简单了吧.” “我一周之内就能做一个更好的版本出来.” 确实,很多人都可以在 Hackatho ...