C# Newtonsoft.Json 自定义

C# Newtonsoft.Json 自定义

当你看到这篇文章时,你应该或多或少地了解 Newtonsoft.Json,它是一套流行的 .NET 高性能 JSON 框架,能够轻松地实现 .NET 对象和 JSON 字符串间的相互转换。本文将首先简介 Newtonsoft.Json 的基本使用,然后介绍如何实现序列化的自定义,即自定义 JsonConverter

基础使用

先定义一个普通的类型,然后标记一些 JSON 相关的特性,这些特性是非必需的。先不解释这些特性的含义,大家对比分析输出内容就能完全明白。

[JsonObject("student")]
public class Student
{
    [JsonProperty("name")]
    public string Name { get; set; }

    //[JsonProperty("age")]
    public int Age { get; set; }

    [JsonIgnore]
    public int Id { get; set; }
}

使用 JsonConvert.SerializeObject() 方法来实现对象的序列化:

var json = JsonConvert.SerializeObject(student, Formatting.Indented);

json 的值为:

{
  "name": "Jim",
  "Age": 10
}

自定义JsonConverter

我们再来看看 List<Student> 序列化后的结果:

public class Students : List<Student>
{
}

var student1 = new Student {Name = "Jim", Age = 10, Id = 1};
var student2 = new Student {Name = "David", Age = 9, Id = 2};

var students = new Students {student1, student2};

var json = JsonConvert.SerializeObject(students, Formatting.Indented);
[
  {
    "name": "Jim",
    "Age": 10
  },
  {
    "name": "David",
    "Age": 9
  }
]

业务上可能要求实现如下输出效果:

{
  "1":{
    "name": "Jim",
    "Age": 10
  },
  "2":{
    "name": "David",
    "Age": 9
  }
}

其中,1、2 为 Student.Id 。要想实现如上效果,就需要使用 JsonConverter 来自定义转换器:

public class StudentsConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var students = value as Students;
        if (students == null)
        {
            return;
        }

        writer.WriteStartObject();
        foreach (var student in students)
        {
            writer.WritePropertyName(student.Id.ToString());
            writer.WriteRawValue(JsonConvert.SerializeObject(student, Formatting.Indented));
        }

        writer.WriteEndObject();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }
}

并在 Students 类型上标记 JsonConverter 特性:

[JsonConverter(typeof(StudentsConverter))]
public class Students : List<Student>
{
}

参考资料

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ironyho

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值