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 序列化后的结果:

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

参考资料

  • Json.NET Documentation

你可能感兴趣的:(C#/WinForm/WPF)