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