文档章节

在C#中使用Json.Net进行序列化和反序列化及定制化

o
 osc_pll3h24t
发布于 2019/05/24 16:19
字数 936
阅读 75
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

  序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象;反序列化(Deserialize)则是将上面的字节流转换为相应对象的过程;在.Net阵营中,Json.Net是由官方推荐的高性能开源序列化/反序列化工具,其官方网站:https://www.newtonsoft.com/json

  一、将对象序列化为Json格式字符串

  首先是正常的序列化操作,对于给定的类:

private class MyClass
{
    public int MyNum;
    public string MyStr;
}

  将该类的实例序列化为Json格式字符串,首先引用命名空间Newtonsoft.Json:

MyClass myClass = new MyClass { MyNum = 10, MyStr = "Hello World" };
Console.WriteLine(JsonConvert.SerializeObject(myClass));

  其打印结果:

{"MyNum":10,"MyStr":"Hello World"}

  在打印到本地Log文件以供自己查看使用时,可以选择转换为带有缩进的Json格式字符串:

Console.WriteLine(JsonConvert.SerializeObject(myClass, Formatting.Indented));

  此时打印结果为:

{
  "MyNum": 10,
  "MyStr": "Hello World"
}

  二、将Json格式字符串反序列化为对象

  对于给定的字符串:

string jsonStr = @"{""MyNum"": 10,""MyStr"": ""Hello World""}";

  将其反序列化为MyClass类型的对象:

MyClass myClass = JsonConvert.DeserializeObject<MyClass>(jsonStr);
Console.WriteLine(myClass.MyStr); //Hello World

  三、使用JObject动态序列化/反序列化

  以上例子都是使用强类型进行序列化和反序列操作,但有时也会用到不指定类型而直接操作Json格式数据的情况,此时就需要用位于命名空间ewtonsoft.Json.Linq中的JObject类型的对象:

string jsonStr = @"{""MyNum"": 10,""MyStr"": ""Hello World""}";
JObject jObject = JObject.Parse(jsonStr);
Console.WriteLine(jObject.ToString(Formatting.None));  //{"MyNum":10,"MyStr":"Hello World"}
//打印一条属性的值
Console.WriteLine(jObject["MyStr"].Value<string>());  //Hello World
//添加一条属性
jObject.Add("MyStr2", "HaHa");
//打印当前Json字符串
Console.WriteLine(jObject.ToString(Formatting.None)); //{"MyNum":10,"MyStr":"Hello World","MyStr2":"HaHa"}

  四、定制化序列化/反序列过程

  1.在C#中,定制化的配置通常使用特性来完成,这里也不例外,例如简单的,在序列化/反序列时忽略某个字段/属性:

private class MyClass
{
    [JsonIgnore]
    public int MyNum;
    public string MyStr;
}

  此时,无论序列化还是反序化时,字段MyNum都不再参与这些过程;

  2.自定义某个字段/属性的序列化/反序列化规则:

  当接收到的Json格式字符串与本地已有类型不统一时,需要进行自定义的反序列化过程,反之亦然,例如Json字符串中以字符串"TRUE"表示布尔类型true(不自定义,这个过程依然走的通,只是以此举例),以字符串"FALSE"表示布尔类型false时,需要自定义如下:

/// <summary>
/// 自定义布尔类型数据转换规则
/// </summary>
public class MyBoolConverter : JsonConverter
{
    private const string TrueStr = "TRUE";
    private const string FalseStr = "FALSE";
    public override bool CanConvert(Type objectType) => true;

    //反序列化
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.ValueType == typeof(string))
        {
            if ((string)reader.Value == TrueStr)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        return false;
    }

    //序列化
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value.GetType() == typeof(bool))
        {
            bool result = (bool)value;
            if (result)
            {
                writer.WriteValue(TrueStr);
            }
            else
            {
                writer.WriteValue(FalseStr);
            }
        }
    }
}

  然后,在需要操作的类型定义中的字段/属性中加入该特性:

private class MyClass
{
    [JsonConverter(typeof(MyBoolConverter))]
    public bool MyBool;
}

  此时:

string jsonStr = @"{""MyBool"": ""TRUE""}";
MyClass1 myClass = JsonConvert.DeserializeObject<MyClass1>(jsonStr);
Console.WriteLine(myClass.MyBool);  //True
Console.WriteLine(JsonConvert.SerializeObject(myClass));  //{"MyBool":"TRUE"}

 


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!

作者:Minotauros
出处:https://www.cnblogs.com/minotauros/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文出处:https://www.cnblogs.com/minotauros/p/10918772.html

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
6K
18
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
642
1
CDH5: 使用parcels配置lzo

一、Parcel 部署步骤 1 下载: 首先需要下载 Parcel。下载完成后,Parcel 将驻留在 Cloudera Manager 主机的本地目录中。 2 分配: Parcel 下载后,将分配到群集中的所有主机上并解压缩。 3 激...

cloud-coder
2014/07/01
6.8K
1
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0

没有更多内容

加载失败,请刷新页面

加载更多

禁用win10无用服务,提高Win10系统游戏性能!

长按二维码关注网络杀手 分享有态度的最好应用 分享干货满的学习教程 网络杀手 公众号的发展离不开大家的支持,非常感谢各位的关注!小编以后会继续努力加油,为大家分享更多更好的教程和应用...

whiteshds
今天
5
0
聊聊dubbo-go的forkingCluster

序 本文主要研究一下dubbo-go的forkingCluster forkingCluster dubbo-go-v1.4.2/cluster/cluster_impl/forking_cluster.go type forkingCluster struct{}const forking = "forking"func......

go4it
今天
13
0
如何在Vim中进行不区分大小写的搜索 - How to do case insensitive search in Vim

问题: I'd like to search for an upper case word, for example COPYRIGHT in a file. 我想搜索大写单词,例如文件中的COPYRIGHT。 I tried performing a search like: 我尝试过执行搜索:......

富含淀粉
今天
17
0
Flutter+FaaS一体化任务编排的思考与设计

简介: 闲鱼flutter faas一体化提升研发体验+研发质量 作者:闲鱼技术-古风 Flutter+Serverless三端一体研发架构,客户端不仅仅是编写双端的代码,而是扩展了客户端的工作边界,形成完整的业...

一肥仔
今天
21
0
lodash和下划线之间的差异[关闭] - Differences between lodash and underscore [closed]

问题: Why would someone prefer either the lodash.js or underscore.js utility library over the other? 为什么有人更喜欢lodash.js或underscore.js实用程序库而不是另一个? Lodash see......

fyin1314
今天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部