JSON是一种常用的轻量级数据交换格式。与XML相比,JSON无论是体积还是可读性都更好,所以在网络数据传输和应用程序中被广泛的应用。
那么,.NET平台使用最广泛的JSON库是什么呢?自然要数Newtonsoft.NET了,打开nuget包管理器第一个就是,在所有包下载量排行中排名第一。使用简单,性能可靠,文档也很齐全。
使用JSON最常用的就是对象的序列化和反序列化。
先来看最基本的使用
1
2
3
4
5
6
7
| // 先定义一个类
public class TestJsonDeseClass
{
public Guid MessageGuid { get; set; }
public string Message { get; set; }
}
|
1
2
3
4
5
6
7
8
| TestJsonDeseClass test = new TestJsonDeseClass()
{
MessageGuid = Guid.NewGuid(),
Message = "Test Message"
};
string json = JsonConvert.SerializeObject(test);
TestJsonDeseClass des =
JsonConvert.DeserializeObject<TestJsonDeseClass>(json);
|
只需要将类的成员属性设置为get
和set
就可以了,反序列化的时候,Json.NET会自动根据成员的名字为对象的成员赋值。
那么如果不想序列化/反序列化某个成员变量呢?
1
2
3
4
5
6
7
8
9
| using Newtonsoft.Json;
public class TestJsonDeseClass
{
[JsonIgnore]
public Guid MessageGuid { get; set; }
public string Message { get; set; }
}
|
只需要在成员变量的定义前加上[JsonIgnore]
的属性(Attribute)即可,序列化/反序列化的时候Json.NET会自动忽略该成员。
如果JSON字符串中的属性名字和定义的类中的成员名字不一样怎么办呢?怎样才能正确的给成员变量赋值呢?
1
2
3
4
5
6
7
8
9
| using Newtonsoft.Json;
public class TestJsonDeseClass
{
[JsonProperty("Guid")]
public Guid MessageGuid { get; set; }
public string Message { get; set; }
}
|
只需要在成员变量的定义前加上[JsonProperty()]
的属性(Attribute)即可,序列化/反序列化的时候Json.NET会将Json字符串中的"Guid"
属性赋值给MessageGuid
。
那么,如果想让类的属性值只读的get
,不想让外部能修改成员变量呢,如何设置呢?
当然这样也是可以的,不过需要我们给类添加构造方法,在构造方法中对成员赋值,不能再使用默认的构造方法,因为默认的构造方法不会对成员赋值,而外部也无法对成员赋值。在添加了构造方法后,Json.NET会自动调用类的构造方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| using Newtonsoft.Json;
public class TestJsonDeseClass
{
public Guid MessageGuid { get; }
public string Message { get; }
public TestJsonDeseClass(Guid messageGuid, string message)
{
MessageGuid = messageGuid;
Message = message;
}
}
|
不过需要注意的是,构造方法的参数名称必须和成员变量(或者说是序列化/反序列化时的属性)名字一致,但可以不用区分大小写,才能正确对属性赋值。
如果把上面的构造方法改成下面这个样子
1
2
3
4
5
| public TestJsonDeseClass(Guid guid, string message)
{
MessageGuid = guid;
Message = message;
}
|
就会导致反序列化的对象MessageGuid
属性不能正确赋值,因为Json.NET无法从json字符串中找到名为guid
的属性,你也没告诉它要拿名为MessageGuid
的属性,自然就会出错了。
那么,最后一个问题,如果我的类有多个构造方法,我怎样告诉Json.NET应该用哪一个呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| using Newtonsoft.Json;
public class TestJsonDeseClass
{
public Guid MessageGuid { get; }
public string Message { get; }
public TestJsonDeseClass()
{
}
[JsonConstructor]
public TestJsonDeseClass(Guid messageGuid, string message)
{
MessageGuid = messageGuid;
Message = message;
}
}
|
只需要在对应的构造方法前面加上[JsonConstructor]
的属性(Attribute)即可,反序列化的时候Json.NET会就会调用相应的构造方法来生成对象了。
以上就是一些基本的用法,基本上能满足正常的使用了。当然还有一些更加高级和灵活的用法,这里就不多记录了,需要的时候再去看文档就可以了。
参考
文档
Samples