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

这篇具有很好参考价值的文章主要介绍了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"
  ]
}

c#示例-json序列化和json树,c#示例,c#
但如果不想这么做,也可以通过解析为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。
如果是值类型但没有对应的键值对,或者值无法解析为目标类型,那么会有异常。文章来源地址https://www.toymoban.com/news/detail-593257.html

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

到了这里,关于c#示例-json序列化和json树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 协议定制 + Json序列化反序列化

    1.1 结构化数据 协议是一种 “约定”,socket api的接口, 在读写数据时,都是按 “字符串” 的方式来发送接收的。如果我们要传输一些\\\"结构化的数据\\\" 怎么办呢? 结构化数据: 比如我们在QQ聊天时,并不是单纯地只发送了消息本身,是把自己的头像、昵称、发送时间、消息本身

    2024年02月09日
    浏览(46)
  • nlohmann::json 超简单序列化反序列化

    2024年01月20日
    浏览(40)
  • iOS处理json,序列化和反序列化

    Mantle 是一个开源的 Objective-C 框架,用于在 iOS 和 macOS 应用程序中实现模型层的序列化和反序列化。它提供了一种简单而强大的方式来将 JSON数据格式转换为自定义的数据模型对象,以及将数据模型对象转换为字典或 JSON 格式。 Mantle具有如下特点 自动映射 Mantle自动将 JSON 数据

    2024年02月11日
    浏览(63)
  • rust学习-json的序列化和反序列化

    由于 serde 库默认使用 JSON 格式进行序列化和反序列化 因此程序将使用 JSON 格式对数据进行序列化和反序列化 JSON:广泛使用的 JavaScript 对象符号,用于许多 HTTP API Postcard:no_std 和嵌入式系统友好的紧凑二进制格式。 CBOR:用于小消息大小且无需版本协商的简洁二进制对象表示

    2024年02月12日
    浏览(40)
  • 【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )

    当谈到网络编程时,序列化和反序列化是非常重要的概念。在上一篇文章中,我们已经了解了在Linux环境下实现简单的TCP网络程序的基础知识。本文将继续探讨序列化和反序列化,这些概念对于在网络上传输数据以及跨网络通信至关重要。通过深入了解序列化和反序列化,我

    2024年04月08日
    浏览(89)
  • 【网络编程】协议定制+Json序列化与反序列化

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。   目录 一、序列化与反序列化的概念 二、自定义协议设计一个网络计算器 2.1TCP协议,如何保证接收方收到了完整的报文呢?

    2024年02月06日
    浏览(56)
  • 使用nlohmann json库进行序列化与反序列化

    nlohmann源码仓库:https://github.com/nlohmann/json 使用方式:将其nlohmann文件夹加入,包含其头文件json.hpp即可 demo

    2024年02月10日
    浏览(40)
  • 【网络】协议的定制与Json序列化和反序列化

    我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层 建立链接和断开链接 基于TCP协议,我们需要知道写代码时对应的接口大概在TCP通讯的过程中属于什么样的时间点角色,在TCP协议时详谈。三次握手,四次挥手 listen状态:准备好了,可以进

    2024年02月09日
    浏览(41)
  • JSON序列化与反序列化NULL值丢失问题

    做项目一般都会有一些特殊的需求,例如保留json中的null值,但是fastjson都会把null值得属性给过滤掉 json序列化保留null值 json反序列化保留null值 使用hutool的Json工具时

    2024年02月15日
    浏览(70)
  • Untiy Json和Xml的序列化和反序列化

    Ps: Unity C# Json 序列化换行 效果: 引用:

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包