Newtonsoft.Json基本使用
使用强类型进行序列化反序列化
准备一个学生类
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public Student(string name, int age)
{
Name = name;
Age = age;
}
}
序列化及反序列化学生对象
Student student = new("张三", 18);
//序列化
string serializeResult = JsonConvert.SerializeObject(student);
Console.WriteLine(serializeResult);
//反序列化
Student student1 = JsonConvert.DeserializeObject<Student>(serializeResult);
Console.WriteLine(student1.Name);
Console.WriteLine(student1.Age);
使用以上方法之所以能对serializeResult字符串进行了反序列化得到一个Student对象,是因为Student类与serializeResult是有对应关系的
使用JObject进行弱类型的反序列化
但是有时从网上获取的json字符串可能层级很多,很复杂,并且没有现成的与之对应的类,那么如何对其进行反序列化呢?我们难道要大费周折去创建一个复杂的类吗,这样显然太麻烦了
幸运的是
Newtonsoft.Json提供了一种能够表示一些json字符串反序列化结果的类JObject
string jsonString = "{\"name\":\"zhangsan\",\"age\":\"17\", \"son\":{\"age\":\"1\"}}";
// jsonString转jObject
JObject jObject = JsonConvert.DeserializeObject<JObject>(jsonString);
// 获取jObject中的属性值
string name = (string)jObject["name"];
int age = (int)jObject["age"];
int sonAge = (int)jObject["son"]["age"];
Console.WriteLine(name);
Console.WriteLine(age);
Console.WriteLine(sonAge);
序列化时将枚举值转成字符串表示
假设有一个People类有一个属性State,State是枚举类型
public class People{
public State State{get; set;}
}
public enum State{
Healthy,
Unhealthy,
}
那么,该对象格式化的结果的将会是这样的:
可以看到枚举值是使用整数来表示的
但是使用整数来表示枚举值,不具备可读性,我们希望Newtonsoft.Json帮我们把People转换成这样的形式
{“State”:“Healthy”}
如何做呢?
只需要在调用SerializeObject方法时传入一个settings
这个settings中需要添加一个转换器StringEnumConverter
People people = new People() { State = State.Healthy };
var settings = new JsonSerializerSettings();
settings.Converters.Add(new StringEnumConverter());
Console.WriteLine(JsonConvert.SerializeObject(people, settings));
转换器
除了StringEnumConverter外,转换器还有很多种类,可查阅官网
一种常用的转换器是IsoDateTimeConverter,它可以使你自定义DateTime序列化后的格式
例如,如果你需要将日期时间序列化后的格式为类似这样的——“2021/11/11 18:15:32”,那么只需要这样一个IsoDateTimeConverter实例添加进JsonSerializerSettings的Converters属性中即可
new IsoDateTimeConverter()
{
DateTimeFormat = "yyyy/MM/dd HH:mm:ss",
}
完整代码演示
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
namespace CSharpTest2
{
public enum StateEnum
{
Healthy,
Unhealthy
}
public class Person
{
public TimeSpan Time { get; set; } = TimeSpan.FromDays(1);
public StateEnum State { get; set; } = StateEnum.Healthy;
public DateTime Birthday { get; set; } = DateTime.Now;
}
class Program
{
public static void Main(string[] args)
{
Person person = new Person();
var settings = new JsonSerializerSettings()
{
Converters = new List<JsonConverter>()
{
new StringEnumConverter(),
new IsoDateTimeConverter()
{
DateTimeFormat = "yyyy/MM/dd HH:mm:ss"
}
}
};
string seResult = JsonConvert.SerializeObject(person, settings);
}
}
}
还可以使用自定义的转换器,不过比较复杂(好吧,我承认我不会)