C# Newtonsoft.Json 浅析
Newtonsoft.Json 是 C# 中一个流行的 JSON 库,提供了丰富的方法来帮助我们序列化、反序列化、转换 JSON 数据。下面是 Newtonsoft.Json 中常用方法的详解:
一、序列化
最常用的序列化方法是
JsonConvert.SerializeObject(object),它可以将一个对象序列化为 JSON 字符串。
var obj = new { Name = "Tom", Age = 18 };
string json = JsonConvert.SerializeObject(obj);
// {"Name":"Tom","Age":18}
此外,JsonConvert 还提供了其他选项,例如:
- JsonConvert.SerializeObject(object, Formatting):指定 JSON 字符串的格式;
- JsonConvert.SerializeObject(object, JsonSerializerSettings):通过 JsonSerializerSettings 参数配置序列化过程;
- JsonConvert.SerializeObject(object, params JsonConverter[]):使用指定的 JsonConverter 类型将对象序列化为 JSON,可以实现自定义序列化逻辑。
二、反序列化
最常用的反序列化方法是
JsonConvert.DeserializeObject<T>(string),它可以将 JSON 字符串反序列化为指定的类型。
string json = @"{""Name"":""Tom"",""Age"":18}";
var obj = JsonConvert.DeserializeObject<Person>(json);
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
与序列化类似,反序列化方法也提供了其他选项:
- JsonConvert.DeserializeObject<T>(string, JsonSerializerSettings):通过 JsonSerializerSettings 参数配置反序列化过程;
- JsonConvert.DeserializeObject(string, Type):可以反序列化为任意类型,使其适用于动态类型的场景;
- JsonConvert.DeserializeObject<T>(JsonReader):从 JsonReader 对象中反序列化,常用于处理大型 JSON 数据。
三、JsonReader 和 JsonWriter
JsonReader 和 JsonWriter 是 Newtonsoft.Json 提供的用于读取和写入 JSON 数据的低级 API。
JsonReader 可以从一个 JsonReader 对象中读取 JSON 数据,其中包含多种不同的方法用于读取不同类型的 JSON 值,例如:
- JsonReader.Read():将 JsonReader 对象读取到下一个 JSON 令牌;
- JsonReader.ReadAsInt32():将当前令牌转换为 int 类型的值;
- JsonReader.ReadAsBoolean():将当前令牌转换为 bool 类型的值。
JsonWriter 可以将 JSON 数据写入到一个 JsonWriter 对象,例如:
var person = new { Name = "Tom", Age = 18 };
using (var writer = new StringWriter())
using (var jsonWriter = new JsonTextWriter(writer))
{
jsonWriter.WriteStartObject();
jsonWriter.WritePropertyName("Name");
jsonWriter.WriteValue(person.Name);
jsonWriter.WritePropertyName("Age");
jsonWriter.WriteValue(person.Age);
jsonWriter.WriteEndObject();
string json = writer.ToString();
Console.WriteLine(json);
// {"Name":"Tom","Age":18}
}
四、LINQ to JSON
除了使用对象和属性来访问和修改 JSON 数据外,Newtonsoft.Json 还提供了 LINQ to JSON API 来解析和创建 JSON 数据。
使用 LINQ to JSON API,你可以轻松地将 JSON 数据解析为 JObject 或 JArray,然后就可以使用 LINQ 功能来处理数据。例如:
string json = @"{
'Name': 'Tom',
'Age': 18,
'Address': {
'City': 'Shanghai',
'Country': 'China'
}
}";
JObject obj = JObject.Parse(json);
string name = (string)obj["Name"];
int age = (int)obj["Age"];
var address = obj["Address"];
string city = (string)address["City"];
string country = (string)address["Country"];
要创建 JSON,您可以使用 JObject 和 JArray 类型:
var person = new JObject();
person["Name"] = "Tom";
person["Age"] = 18;
var address = new JObject();
address["City"] = "Shanghai";
address["Country"] = "China";
person["Address"] = address;
Console.WriteLine(person.ToString());
// {"Name":"Tom","Age":18,"Address":{"City":"Shanghai","Country":"China"}}
总的来说,Newtonsoft.Json 是一个非常强大和灵活的 JSON 库,提供了丰富的方法来处理 JSON 数据。
除了上述方法外,还有以下一些常用的方法:
五、匿名类型和 JSON
在使用
JsonConvert.SerializeObject() 方法时,可以通过传递一个匿名对象来进行动态序列化。例如:
string json = JsonConvert.SerializeObject(new
{
Name = "Tom",
Age = 18
});
// {"Name":"Tom","Age":18}
六、自定义序列化
如果要对对象进行自定义序列化,可以使用自定义的 JsonConverter,例如:
public class CustomConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Person);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// 从 reader 中读取 JSON 数据,并将其转换为 Person 对象
// ...
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// 将 Person 对象序列化为 JSON 数据,并写入 writer 中
// ...
}
}
var settings = new JsonSerializerSettings();
settings.Converters.Add(new CustomConverter());
string json = JsonConvert.SerializeObject(new Person { Name = "Tom", Age = 18 }, settings);
在上面的代码中,我们创建了一个名为 CustomConverter 的 JsonConverter 类型,重写了它的 CanConvert()、ReadJson() 和 WriteJson() 方法来实现自定义序列化和反序列化。
七、预设的 JsonConverter
Newtonsoft.Json 还提供了一些预设的 JsonConverter,用于处理特定的类型或场景。例如:
- StringEnumConverter:将枚举值序列化为字符串;
- IsoDateTimeConverter:将 DateTime 对象序列化为 ISO 8601 格式的字符串;
- XmlConverter:将 XML 转换为 JSON 或将 JSON 转换为 XML;
- BinaryConverter:将字节数组序列化为 Base64 编码的字符串。
使用预设的 JsonConverter,可以方便地处理常见的序列化场景。
总的来说,Newtonsoft.Json 提供了丰富的方法和功能,能够轻松地处理 JSON 数据。无论是序列化、反序列化还是修改 JSON 数据,Newtonsoft.Json 都是一个非常值得推荐的 JSON 库。
创作不易,如果您喜欢还请帮忙点赞关注,谢谢!