JSON 序列化与反序列化

JSON序列化与反序列化

JSON是什么

JSON是一种轻量级的数据交互格式,简单来说就是键值对形式的字符串,{"name":"admin","age":18}示例如下:

{
	"userName": "admin",
	"age": 17,
	"gender": true,
	"books": [{
		"title": "厚黑学",
		"date": "1970 年1月1日",
		"author": null
	}, {
		"title": "厚黑学",
		"date": "1970 年1月1日",
		"author": "张三"
	}]
}

Newtonsoft.Json

.NET最常用的JSON序列化器,JSON序列化必备,官网:https://www.newtonsoft.com/json

对象的序列化与反序列化

将字符串转化成对象

//JSON JSON字符串
string str = "{\"userName\":\"admin\",\"age\":17,\"gender\":true,\"books\":[{\"title\":\"厚黑学\",\"date\":\"1970 年1月1日\",\"author\":null},{\"title\":\"厚黑学\",\"date\":\"1970 年1月1日\",\"author\":\"张三\"}]}";
Person p =JsonConvert.DeserializeObject<Person>(str);
foreach (var item in p.books)
{
    Console.WriteLine($"书名:{item.title},作者:{item.author}");
}

将对象转化成JSON

p.Name = "王二小";
string tmo = JsonConvert.SerializeObject(p);

序列化与反序列化忽略某些属性

  • 忽略类内所有属性

[JsonObject(MemberSerialization.OptIn)]用于在序列化与反序列化时忽略一个类里所有的属性,只有当在类内属性上打特性标签[JsonProperty]时才支持序列化与反序列化。

[JsonObject(MemberSerialization.OptIn)]
public class Person
{
    /// <summary>
    /// admin
    /// </summary>
    [JsonProperty]
    public string Name { get; set; }
    /// <summary>
    /// Age
    /// </summary>
    public int age { get; set; }

    private int money { get; set; }

    /// <summary>
    /// Gender
    /// </summary>
    /// 
    public bool gender { get; set; }
    public List<Books> books { get; set; }
}

  • 序列化所有属性(默认)

默认实体类上默认打着[JsonObject(MemberSerialization.OptOut)]特性标签(可以省略不写),如果要忽略某些属性,要在属性上打[JsonIgnore]。

[JsonObject(MemberSerialization.OptOut)]
public class Person
{
    /// <summary>
    /// admin
    /// </summary>
    [JsonIgnore]
    public string Name { get; set; }
    /// <summary>
    /// Age
    /// </summary>
    public int age { get; set; }

    private int money { get; set; }

    /// <summary>
    /// Gender
    /// </summary>
    /// 
    public bool gender { get; set; }
    public List<Books> books { get; set; }
}
  • 动态控制实体类属性的是否忽略序列化(默认)

当某些条件下需要序列化A属性和B属性,某些情况下需要忽略A属性与B属性,我们该怎么做?
答:使用JsonSerializerSettings设置某实体类对象要忽略序列化的属性(配合if与else控制属性的动态忽略)。

JsonSerializerSettings jsetting=new JsonSerializerSettings();
jsetting.ContractResolver = new LimitPropsContractResolver(new string[] { "Age", "IsMarry" });
Console.WriteLine(JsonConvert.SerializeObject(p, Formatting.Indented, jsetting));

好文推荐

https://www.lagou.com/lgeduarticle/54110.html 这篇文章详细讲解了一些Json.NET常用方法,言简意赅。

posted @ 2021-03-21 22:41  AJun816  阅读(238)  评论(0编辑  收藏  举报