使用System.Text.Json处理Json文档以及部分坑
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文档以及部分坑的更多相关文章
- 在项目中利用TX Text Control进行WORD文档的编辑显示处理
在很多文档管理的功能模块里面,我们往往需要对WORD稳定进行展示.编辑等处理,而如果使用微软word控件进行处理,需要安装WORD组件,而且接口使用也不见得简单易用,因此如果有第三方且不用安装Offi ...
- 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去掉 ...
- CI 笔记,使用 json的参考文档(废弃)
Json的处理转换, Json转换步骤, a) 先设置json为空字符串, b) While循环,遍历, While(!!$row = mysql_fetch_arra ...
- RESTful API接口文档规范小坑
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 前后端分离的开发模式,假如使用的是基于RESTful API的七层通讯协议,在联调的时候,如何避免配合过程中出现问 ...
- elasticsearch 第五篇(文档操作接口)
INDEX API 示例: 1 2 3 4 5 PUT /test/user/1 { "name": "silence", "age": 2 ...
- mongoDB文档操作【增删改】
MongoDB 插入文档 文档的数据结构和JSON基本一样. 所有存储在集合中的数据都是BSON格式. BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON. 插入文档 Mo ...
- elasticsearch——海量文档高性能索引系统
elasticsearch elasticsearch是一个高性能高扩展性的索引系统,底层基于apache lucene. 可结合kibana工具进行可视化. 概念: index 索引: 类似SQL中 ...
- 关于Elasticsearch文档的描述以及如何操作文档的详细总结
文档 什么是文档 在大多数应用中,多数实体或对象可以被序列化为包含键值对的 JSON 对象. 一个 键 可以是一个字段或字段的名称,一个 值 可以是一个字符串,一个数字,一个布尔值, 另一个对象,一些 ...
- Elasticsearch 7.x 之文档、索引和 REST API 【基础入门篇】
前几天写过一篇<Elasticsearch 7.x 最详细安装及配置>,今天继续最新版基础入门内容.这一篇简单总结了 Elasticsearch 7.x 之文档.索引和 REST API. ...
随机推荐
- maven出现:Failed to execute goal on project ...: Could not resolve dependencies for project ...
项目结构是一个父项目,多个子项目目录: 例如: common --------------(父项目) fristDemo ------------(子项目) 如果在子项目中调用了父项目,而对(子 ...
- PrintWriter out = response.getWriter();乱码解决
resopnse request的乱码问题 今天在改项目时,发现这个简单又容易忽视在问题.说起这个问题,比较简单,但也比较容易忽视.下面就具体讲讲这个问什么会出现乱码问题. request乱码指的 ...
- Java虚拟机一看就懂01
Jvm内存结构 --- 线程隔离区域说明: 1.1.程序计数器 线程私有 是一块内存空间 唯一的一个在Java虚拟机规范中没有规定任何OOM情况的区域(不会OOM?) 1.2.Java虚拟机栈 线程私 ...
- Django2.0使用
创建项目: 通过命令行的方式:首先要进入到安装了django的虚拟环境中.然后执行命令: django-admin startproject [项目的名称] 这样就可以在当前目录下创建一个项目了. 通 ...
- C# 读取Word内容控件
在Word中,借助内容控件,可设计出具有特定功能的文档或模板.以下表格中简单介绍了几种常用的内容控件. 名称 简介 下拉列表内容控件 下拉列表包含了一个预先定义好的列表.和组合框不同的是下拉列表不允许 ...
- egret之每日登陆奖励
//*******首登奖励********* */ //*********************** */ public setUserSetting(key, value) { if (value ...
- lua_基本语法
学习lua,首先应该了解热更新. 热更新:可以在不重新下载客户端的情况下更新软件内容.在使用软件过程中,我们经常会遇到这种情况:升级软件,没错,这就使用的是热更新. C#不能直接热更新,原因为:C#脚 ...
- HDU 6053(莫比乌斯反演)
题意略. 思路:首先想到暴力去扫,这样的复杂度是n * min(ai),对于gcd = p,对答案的贡献应该是 (a1 / p) * (a2 / p) * .... * (an / p),得出这个贡献 ...
- Java——excel导入导出demo
1. java导入 package xx; import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.userm ...
- zabbix设置钉钉报警
1 添加机器人 在钉钉群里面添加一个机器人 会获取到一个URL: 'https://oapi.dingtalk.com/robot/send?access_token=62be1ea97b4653b8 ...