Newtonsoft.Json官方文档
https://www.newtonsoft.com/json/help/html/Introduction.htm
json内容反序列化
定义好数据结构,使用JsonConvert.DeserializeObject方法将json字符串中的内容,根据key将对应的value赋值到目标数据结构的字段中。(这里不区分大小写)。
如:
public User
{
public int Id;
public string Pwd;
}
json文件内容为:
{
"default": 0,
"users": [
{
"id": 0,
"pwd": "123123",
},
{
"Id": 1,
"Pwd": "123456",
}
]
}
使用如下代码即可实现反序列化:
using (var file = new StreamReader(File.Open(path, FileMode.Open, FileAccess.Read), Encoding.GetEncoding("GB2312")))
{
using (var reader = new JsonTextReader(file))
{
JObject o = (JObject)JToken.ReadFrom(reader);
int.TryParse(o.GetValue("default").ToString(), out var defaultId);
DefaultId = defaultId;
var users = JsonConvert.DeserializeObject<List<User>>(o.GetValue("users").ToString());
// or
var dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(o.ToString());
}
}
这里需要注意的是如果数据形式为{key: value}或者{key: […]}这种形式,则使用以上方法。
如果为[{…}, {…}]这种形式,则需改成以下形式
JObject o = (JArray)JToken.ReadFrom(reader);
...
var users = JsonConvert.DeserializeObject<List<User>>(o.ToString());
子类的序列化与反序列化
// 如果序列化对象为子类,则需要设置序列化Setting,在输出json文件里,保存源对象的数据类型。
var str = JsonConvert.SerializeObject(jsonStr, Formatting.Indented, new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.All
});
File.WriteAllText(jsonPath, str);
var jsonStr = File.ReadAllText(jsonPath);
JsonConvert.DeserializeObject<List<T>>(jsonStr, new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.All
});
json内容大小写问题
不区分大小写总是可能会出现问题,甚至有时候json中的字段与数据结构字段名称并非一致,这个时候就需要通过特性[JsonProperty("TargetName")]
来做映射。这里需要提醒的是,如果指定了JsonProperty特性的话,数据结构的字段与json字段的key就是严格按大小写进行映射,如无匹配则为该字段类型默认值。
public User
{
[JsonProperty("id")]
public int Id;
[JsonProperty("pwd")]
public string Msg;
}
json文件内容为:
{
"default": 0,
"users": [
{
"id": 0,
"pwd": "123123",
},
{
"Id": 1,
"Pwd": "123456",
}
]
}
如果按以上代码写,只有key为“id”,“pwd”的字段能正确的反序列化。并且,“pwd”被映射至User.Msg。
指定列不参与序列化反序列化
在目标字段增加特性[JsonIgnore]
用于标注该字段不参与json的序列化。