c#示例-json序列化和json树

news2024/12/26 22:46:09

序列化

由于指针和引用类型的存在,在运行中的程序中,数据不一定是整块的。
可能东一块西一块散落在内存的各个地方。

序列,是指连续且有序的一个整体。序列化就是把数据变为连续有序整体的过程。
经过这样处理后的数据就可以方便的进行传输和储存了。

Json序列化

json格式

json是一种文本数据格式。用键值对的形式表示数据的名字和数据的内容。
在c#中,时间,数字,字符串及其他的基本类型内置了直接和字符串进行转化的方式。
而复杂类型会通过反射拆解他的成员,一直拆解直到只有基本类型为止。

class Weapon
{
	public (int, int) Attack { get; set; }
	public float Speed { get; set; }
	public int Level { get; set; }
}
{
  "Attack": {
    "Item1": 10,
    "Item2": 20
  },
  "Speed": 1.5,
  "Level": 3
}

序列化api

Newtonsoft.Json是c#常用的一个json序列化扩展包。通常他会随着模板项目创建一起引用。
如果没有,引入以下命名空间并右键点击安装Newtonsoft.Json包,VS会自动找到对应的扩展包并下载和引用。

using Newtonsoft.Json;

通过JsonConvert.SerializeObject方法可以将任意类型序列化为json字符串。
但是默认情况下只会序列化属性,不会序列化字段。

Weapon weapon = new Weapon() { Attack = (10, 20), Speed = 1.5f, Level = 3 };
string json = JsonConvert.SerializeObject(weapon);
Console.WriteLine(json);

使用JsonConvert.DeserializeObject方法可以将字符串反序列化为类型实例。
需要使用泛型才能精确判断你的目标类型。

string dejson = @"{""Attack"":{""Item1"":10,""Item2"":20},""Speed"":1.5,""Level"":3}";
Weapon deweapon = JsonConvert.DeserializeObject<Weapon>(dejson);
Console.WriteLine(deweapon.Attack);

反序列化是通过反射进行赋值的。

  • 因此如果json内容里存在一个你的类型没有的属性,这个属性会被忽略。
  • 如果json的内容里不存在你的类型需要的属性,那么这个属性不会被赋值,只会保持默认值。
  • 如果你的属性不具有set访问器,他不会被赋值。
  • 如果你的构造器里有同名的参数,那么会传递参数给构造器,并且之后不会再对属性赋值。

特性控制序列化规则

特性可以在反射的时候被识别到。但是不同的库是识别的特性可能是不同的。

public class Person
{
    // 指定json属性的名称为"name"
    [JsonProperty("name")]
    public string Name { get; set; }

    // 指定json属性的顺序为1
    [JsonProperty(Order = 1)]
    public int Age { get; set; }

    // 指定json属性为null时忽略不写入json中
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Gender { get; set; }
}

这个库中的特性有很多的设置,详情请参阅其他文档。

Json树

为了读取json的数据,通常会制作一个实体类,然后反序列化。接着通过类实例获取数据。

{
  "Name": "Alice",
  "Age": 25,
  "Hobbies": [
    "Reading",
    "Cooking",
    "Gaming"
  ]
}

在这里插入图片描述
但如果不想这么做,也可以通过解析为Json类型来读取数据。

Json节点类型

  • JToken:所有json节点的基类
    • Jobject:json对象,用大括号包围的内容,内含多个键值对。
      • JProperty:每一对键值对。包括属性的名字和属性的值。
        • JValue:属性的值。包括Jobject,Jarray,或基本数据类型例如bool,int,string
    • Jarray:json的数组,用中括号包围的内容。里面有一堆并列的值,他们没有名字。

解析json

可以从Jobject,JArray,JToken等类型的静态方法Parse解析字符串。
或者可以通过FromObject序列化一个实例。
解析出来的JToken可以ToString为序列化后的字符串,或者可以ToObject反序列化成实例。

string json = @"{
  ""Name"": ""Alice"",
  ""Age"": 25,
  ""Hobbies"": [
    ""Reading"",
    ""Cooking"",
    ""Gaming""
  ]
}";

var jobject = JObject.Parse(json);
var person = jobject.ToObject<Person>();
jobject = JObject.FromObject(person);
Console.WriteLine(jobject);

public class Person
{
	public string Name { get; set; }
	public int Age { get; set; }
	public string[] Hobbies { get; set; }
}

获取和修改节点内容

Jobject可以通过索引器来获取子节点的内容。
如果是一个字符串,那么会查找子节点中同名的JProperty。
如果是一个int,那么会在Jarray中查找该索引的内容。

string json = @"{
  ""Name"": ""Alice"",
  ""Age"": 25,
  ""Hobbies"": [
    ""Reading"",
    ""Cooking"",
    ""Gaming""
  ]
}";

var jobject = JObject.Parse(json);
var jarr = jobject["Hobbies"];
Console.WriteLine(jarr);
Console.WriteLine(jarr[0]);

可以通过索引器修改节点。但对数组添加内容必须通过添加节点方法。

jobject["Hobbies"][0] = "666";
jobject["Hobbies"][2].AddAfterSelf("14.6");
jobject["Date"] = "2012-4-8";
Console.WriteLine(jobject);

对于基本类型,可以通过强制转化来直接序列化。
如果没有对应的键值对,那么引用类型或可为空值类型的强制转换会得到null。
如果是值类型但没有对应的键值对,或者值无法解析为目标类型,那么会有异常。

jobject["Date"] = "2012-4-8";  
DateTime date = (DateTime)jobject["Date"];
int? age = (int?)jobject["Age"];
string name = (string)jobject["Name"];
Console.WriteLine(date);
Console.WriteLine(age);
Console.WriteLine(name);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/751129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1130 - Host XXX‘ is not allowed to connect to this MySQL server

mysql 连接报错 这个问题是因为在数据库服务器中的mysql数据库中的user的表中没有没有用户 解决的方法&#xff1a; 登入mysql后&#xff0c;更改 “mysql” 数据库里的 “user” 表里的 “host” 项&#xff0c;从”localhost”改称’%’。 1、连接服务器: mysql -u root -p…

万字解读 | 数据可视化平台--FineBI

什么是BI 学习目标 知道什么是BI 知道FineBI的优势 1. 商业智能: BI&#xff08;Business Intelligence&#xff09;是指通过收集、分析和解释企业内外部数据&#xff0c;为企业决策提供支持和指导的一种技术和工具。商业智能的目标是帮助企业管理者和决策者更好地理解企业…

vivado 添加 pynq-z2板

以vivado2019.02版本为例 1下载地址 https://www.tulembedded.com/FPGA/ProductsPYNQ-Z2.html 2.点击下载 3.解压添加 注&#xff1a;如果没有board_files 可以自己创建一个 4.重新打开vivado

跨境电商企业实施WMS仓储管理系统有什么要注意的

在跨境电商行业中&#xff0c;仓储管理是关键的环节之一。为了提高仓储效率和准确性&#xff0c;许多跨境电商企业选择实施WMS仓储管理系统解决方案。然而&#xff0c;实施电商企业WMS系统并不是一项简单的任务&#xff0c;需要注意一些关键要点。本文将介绍跨境电商企业实施WM…

Ubuntu 18.04 Docker 安装配置 Apollo 6.0

百度 Apollo 安装测试&#xff08;1&#xff09; Apollo 6.0 安装完全指南 在这一步出错&#xff1a; 进入到 Apollo 源码根目录&#xff0c;打开终端&#xff0c;执行下述命令以启动 Apollo Docker 开发容器 ./docker/scripts/dev_start.sh并没有成功启动 Apollo docker 开发…

科技成果鉴定报告的重要性

科技成果鉴定是评估科技成果价值、可行性和科学性的过程&#xff0c;鉴定结果直接关系到科技成果的应用和推广。科技成果鉴定报告是鉴定结果的呈现和总结&#xff0c;对于科技成果的评估和利用具有重要的价值和意义。 1、科技成果价值评估&#xff1a;在科技创新和技术发展中…

在VMware Workstation安装 ESXI8.0初体验

文章目录 &#x1f41f;前言&#x1f41f;安装&#x1f41f;在VMware WorkStation中创建虚拟机&#x1f41f;ESXI部署安装&#x1f41f;安装完成后配置 &#x1f41f;前言 ESXI8.0版本开始最低RAM从以前的4GB变为8GB 本文所使用到的镜像以及Key都可以到我的网站中下载 地址&…

数学分析:k维曲面

这部分比较抽象&#xff0c;我就不按照书本上的定义来了&#xff0c;直接讲直观的理解。 一般来说&#xff0c;我们认为&#xff1a; 这是一个圆&#xff0c; 但同时也可以认为他是一个一维的曲面。 同理 是一个球面 但同时也是一个二维的曲面&#xff0c;依次类推。 我们…

AWS 云区域(region),可用区(AZ)

AWS 提供三种地理性组件&#xff1a; Regions&#xff1a;区域&#xff0c;即AWS提供云服务的一个区域&#xff0c;其目的是为了用户能就近接入&#xff0c;降低网络延迟。通常是一个城市的若干个AZ组成一个region。2016年&#xff0c;AWS 宣布在其全球region之间建设了100GbE…

对 Jenkins+ANT+Jmeter 接口测试的实践

目录 1、前言 2、框架与数据准备 3、脚本设计 4、整理测试报告 1、前言 JenkinsANTJMeter是一种常见的接口测试实践方案&#xff0c;可以实现自动化的接口测试和持续集成。Jenkins是一个流行的持续集成工具&#xff0c;ANT是一个构建工具&#xff0c;而JMeter是一个功能强大…

journalctl命令

要查看系统日志信息&#xff0c;使用journalctl工具即可。 不加任何参数&#xff0c;它将显示系统日志的全部信息&#xff1a;显示的顺序是从旧到新。 [rootvm1 ~]# journalctl -- Logs begin at Fri 2023-07-14 05:12:22 CST, end at Thu 2023-07-13 21:20:01 CST. -- Jul 14…

re学习(15)BUUCTF 2019红帽杯easyRe

参考视频&#xff1a; 【BUUCTF】每天一个CTF11“2019红帽杯easyRe”_哔哩哔哩_bilibili &#xff08;本人觉得看视频比看博客效率能提高十倍&#xff0c;呜呜呜&#xff0c;还是视频香~~~与君共勉&#xff09; 下载地址&#xff1a; BUUCTF在线评测 前言&#xff1a;虽然…

论文出矢量图EMF

PDF---->矢量图EMF工具&#xff1a; PDF to EMF | CloudConvert solidworks截图打印为PDF&#xff1b; matlab打开图像--编辑-复制--粘贴 - CAD打印输出PDF

传输网络介绍

文章目录 1、通信传输介质有哪些&#xff1f; 同轴电缆 –由外到内分别是&#xff1a;塑料皮层、屏蔽层、绝缘层、铜芯。 光纤 –由圆玻璃纤芯和玻璃包层构成&#xff0c;最外层是塑料护套。 双绞线 –由两根具有绝缘保护层的互相绞在一起铜导线组成的。 2、通信网络常见的组…

60题学会动态规划系列:动态规划算法第五讲

子数组系列题目 文章目录 1.最大子数组和2.环形子数组的最大和3.乘积最大数组4.乘积为正数的最长子数组长度5.等差数列划分6.最长湍流子数组7.单词拆分8.环绕字符串中唯一的子字符串 1.最⼤⼦数组和 力扣链接&#xff1a;力扣 给你一个整数数组 nums &#xff0c;请你找出一个…

自动化测试Allure报告使用详解

这一节主要是记录allure的内容以及用法&#xff0c;怎么让他生成一个完整的想要的报告。 allure生成的报告和其他五花八门的报告对比了一下&#xff0c;它的可读性是最好、最直观的。这不仅仅是我想要的效果&#xff0c;也是很多小伙伴想要的结果&#xff0c;毕竟这是给领导看…

Vue使用keep-alive设置哪些组件可以被缓存,哪些不被缓存

需求&#xff1a;当一个项目中&#xff0c;不是所有的组件页面都需要缓存起来&#xff0c;因为有些页面是不需要的 <keep-alive><router-view v-if"$route.meta.keepAlive"></router-view> </keep-alive><router-view v-if"!$rout…

27、简述线程池处理线程

简述线程池处理线程 线程池执行任务 判断核心线程是否已满&#xff0c;如果未满&#xff0c;则 创建核心线程执行&#xff0c;如果已满&#xff0c;则走下一步判断队列是否已满&#xff0c;如果未满&#xff0c;则 将任务放到队列中&#xff0c;如果已满 &#xff0c; 则走下一…

03关于golang中各种运算符的讲解代码和注释

运算符 算术运算符&#xff1a;关系运算符&#xff1a;逻辑运算符&#xff1a;赋值运算符&#xff1a;位运算符&#xff1a; 在Golang中&#xff0c;运算符是用于执行各种数学和逻辑操作的符号。本文将对Golang中常见的运算符进行讲解&#xff0c;并提供一些示例代码和注释。 …

ECharts笔记-------饼状图

这幅饼状图由title、legend、series和tooltip这四个组件组成&#xff0c;每个组件都有对应的属性来调节参数&#xff0c;下面是组件的具体内容。 title组件 title: {text: ECharts 饼状图 }, 这副图只用了title组件的text属性用来设置标题内容,title还有以下属性(部分)&…