[Newtonsoft.Json学习笔记] - 序列化与反序列化

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的序列化。

你可能感兴趣的:(学习笔记,C#/.NET,json)