在C#中操作JSON数据可以使用Json.NET这个第三方开源库,也叫做Newtonsoft.Json。它是一个高性能、灵活和流行的JSON转换库,支持将.NET对象转换为JSON字符串,以及将JSON字符串转换为.NET对象。
Json.NET提供了非常灵活和易于使用的API,支持深度自定义序列化和反序列化,支持处理日期、空值和循环引用等场景,拥有很高的性能和稳定性,是使用C#开发JSON应用的首选库。
在使用Json.NET之前,需要先安装相应的NuGet包。可以通过Visual Studio的NuGet包管理器或者通过Package Manager Console来安装。例如,在Package Manager Console中,可以使用以下命令来安装Json.NET包:
Install-Package Newtonsoft.Json
安装完成后,可以在代码中通过using语句来引用命名空间,例如:
using Newtonsoft.Json;
这样就可以使用Json.NET库中的API来进行对象和JSON数据的转换了。
下面是他的一些常用的示例。
1.将对象转换成JSON字符串
MyClass obj = new MyClass();
string json = JsonConvert.SerializeObject(obj);
2.将JSON字符串转换成.NET对象
string json = "{ 'name': 'Tom', 'age': 30 }";
Person p = JsonConvert.DeserializeObject<Person>(json);
3.将.NET对象转换成JSON格式的文件
MyClass obj = new MyClass();
using (StreamWriter file = File.CreateText(@"c:\path\to\file.json"))
{
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(file, obj);
}
4.从JSON格式的文件中读取数据,转换成.NET对象
using (StreamReader file = File.OpenText(@"c:\path\to\file.json"))
{
JsonSerializer serializer = new JsonSerializer();
MyClass obj = (MyClass)serializer.Deserialize(file, typeof(MyClass));
}
5.指定JSON序列化的格式选项
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
string json = JsonConvert.SerializeObject(obj, settings);
备注:
在C#的JSON序列化中,还有其他的枚举可用于控制输出的JSON字符串的格式,常见的枚举包括:
-
Formatting.None: 不对输出的JSON字符串进行任何格式化,生成的JSON字符串是一个长字符串。
-
Formatting.Indented:将输出的JSON字符串进行缩进和换行,以使其更易于阅读和理解。
-
PreserveReferencesHandling.None:在序列化过程中不保留对象之间的引用关系。如果一个对象被多次引用,则每个引用都会被序列化为独立的对象。
-
PreserveReferencesHandling.Objects:在序列化过程中保留对象之间的引用关系。如果一个对象被多次引用,则每个引用都会被序列化为一个对象,但这些对象都会共享一个标识符。
-
TypeNameHandling.None:序列化时不序列化对象的类型信息,反序列化时也不重新创建对象的类型信息。
-
TypeNameHandling.Auto:序列化时自动将对象的类型信息作为JSON属性写入JSON字符串中,反序列化时将根据JSON属性中的类型信息创建对象。
-
TypeNameHandling.All:序列化时将所有对象的类型信息都作为JSON属性写入JSON字符串,反序列化时也会根据JSON属性中的类型信息创建对象。
这些枚举可以在使用Newtonsoft.Json库进行JSON序列化时进行设置和配置。(没用过,可能会用到,先查出来留着万一以后需要了呢)
6.使用JsonConvert.SerializeObject方法将.NET对象转换成JSON字符串,忽略空值属性
MyClass obj = new MyClass();
string json = JsonConvert.SerializeObject(obj, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
在C#的JSON序列化中,NullValueHandling
是一个枚举类型,用于控制是否在输出的JSON字符串中包含属性值为null的属性。
常见的NullValueHandling
枚举值有:
-
NullValueHandling.Include: 在JSON对象中包括属性值为null的属性。
-
NullValueHandling.Ignore: 在JSON对象中忽略属性值为null的属性。
这个枚举类型可以通过设置JsonSerializerSettings.NullValueHandling
属性进行配置,例如:
var serializerSettings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore // 忽略null属性
};
string jsonString = JsonConvert.SerializeObject(myObject, Formatting.Indented, serializerSettings);
这个设置会在进行JSON序列化时忽略掉所有值为null的属性。如果省略了这个设置,那么默认行为是将所有值为null的属性都包含在生成的JSON字符串中。
7.使用JsonProperty属性指定.NET对象属性和JSON属性名称不同的映射关系
public class Person
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("age")]
public int Age { get; set; }
}
8.将JSON字符串转换成JObject对象,方便对JSON数据进行动态处理
string json = "{ 'name': 'Tom', 'age': 30 }";
JObject jo = JObject.Parse(json);
string name = (string)jo["name"];
int age = (int)jo["age"];
9.使用JsonTextReader和JsonTextWriter读写JSON数据流
using (TextWriter textWriter = File.CreateText(@"c:\path\to\file.json"))
using (JsonTextWriter writer = new JsonTextWriter(textWriter))
{
writer.Formatting = Formatting.Indented;
writer.WriteStartObject();
writer.WritePropertyName("name");
writer.WriteValue("Tom");
writer.WritePropertyName("age");
writer.WriteValue(30);
writer.WriteEndObject();
}
using (TextReader textReader = File.OpenText(@"c:\path\to\file.json"))
using (JsonTextReader reader = new JsonTextReader(textReader))
{
JObject obj = (JObject)JToken.ReadFrom(reader);
string name = (string)obj["name"];
int age = (int)obj["age"];
}