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

序列化

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

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

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; }
}

详细的特性控制请参阅其他文档。Serialization Attributes

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.hqwc.cn/news/21914.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode---353周赛

周赛题目 2769. 找出最大的可达成数字 2770. 达到末尾下标所需的最大跳跃次数 2771. 构造最长非递减子数组 2772. 使数组中的所有元素都等于零 一、找出最大的可达成数字 这题就是简单的不能在简单的简单题&#xff0c; 题目意思是&#xff1a;给你一个数num和操作数t&…

【通过迭代相位检索重建衍射图案和全息图中缺失信息】不完整衍射图案的迭代重建和缺失像素的恢复(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

基于深度学习的高精度猴子检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度猴子检测识别系统可用于日常生活中或野外来检测与定位猴子目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的猴子目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

Stable Diffusion - 提示词翻译插件 sd-webui-prompt-all-in-one

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131649921 sd-webui-prompt-all-in-one 是一个基于 stable-diffusion-webui 的扩展&#xff0c;目的是提高 提示词/反向提示词 输入框的使用体验&…

Android Camera2-预览、拍照、录像流程

一、Camera2实现预览、拍照、录像三大基础功能的流程框架图 Camera2关键几个类&#xff1a; CameraManager 管理手机上的所有摄像头设备。管理手机上的所有摄像头设备&#xff0c;它的作用主要是获取摄像头列表和打开&#xff08;openCamera&#xff09;指定的摄像头。 它其…

SpringBoot+微信小程序在线订餐小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBoot微信小程序框架开发的在线订餐小程序系统。首先&#xff0c;这是一个前后端分离的项目&#xff0c;代…

并行计算框架Polars、Dask的数据处理性能对比

在Pandas 2.0发布以后&#xff0c;我们发布过一些评测的文章&#xff0c;这次我们看看&#xff0c;除了Pandas以外&#xff0c;常用的两个都是为了大数据处理的并行数据框架的对比测试。 本文我们使用两个类似的脚本来执行提取、转换和加载(ETL)过程。 测试内容 这两个脚本主…

我爱学QT--qt的网络编程

学习地址&#xff1a; QT网络编程之TCP通信_哔哩哔哩_bilibili QT网络编程有TCP和UDP。 TCP编程需要用到两个类&#xff1a;QTcpServer和QTcpSocket 本节课目标&#xff1a; 完成一个服务器和一个客户端 首先是经典的几步 先设计ui再设计逻辑实现 多看看写的文件理解吧

设计模式-简单工厂模式

文章目录 简单工厂设计模式什么是简单工厂?为什么使用简单工厂工厂模式代码实现简单工厂优缺点优点&#xff1a; 简单工厂设计模式 学习视频 什么是简单工厂? 简单工厂模式属于类的创建型模式&#xff0c;又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实…

vue中使用Pinia和Vuex详解

最具有争议的Pinia和Vuex那个更好&#xff1f; 我们使用Vue2的时候&#xff0c;Vuex作为一个状态管理工具在组件中使用方便了很多。Vue3推出后&#xff0c;虽然相对于Vue2很多东西都变了&#xff0c;但是核心的东西还是没有变的&#xff0c;比如说状态管理、路由等等。实际上&a…

Group, AnimationUpdate, Menu 的使用

1. Group 组堆栈布局的使用 1.1 实现 // 组堆栈 struct GroupBootcamp: View {var body: some View {VStack(spacing: 50) {Text("Hello, world!")Group() {Text("Hello, world!")Text("Hello, world!")}.font(.caption).foregroundColor(.gree…

智头条|第25届中国建博会(广州)成功举行,马斯克组建xAI公司

行业动态&#xff1a; 第25届中国建博会&#xff08;广州&#xff09;成功举行 7月8日至11日期间&#xff0c;2023中国建博会(广州)暨首届广州卫博会在广州如火如荼地进行。本届展会以“冠军企业首秀平台”为定位&#xff0c;以“建装理想家&#xff0c;服务新格局”为主题&a…