zoukankan      html  css  js  c++  java
  • 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常用方法,言简意赅。

    登峰造极的成就源于自律
  • 相关阅读:
    [LeetCode] 55. Jump Game 跳跃游戏
    [LeetCode] 163. Missing Ranges 缺失区间
    [LeetCode] 228. Summary Ranges 总结区间
    获取当时时间和日期
    响应式布局设备分界点
    html5shiv.js分析-读源码之javascript系列
    建站模板开源代码
    js 调试问题
    transform使用参考指南
    浏览器版本过低
  • 原文地址:https://www.cnblogs.com/fishpond816/p/14564258.html
Copyright © 2011-2022 走看看