Newtonsoft.Json高级用法

Newtonsoft.Json高级用法Newtonsoft Json 使用总结

Newtonsoft.Json介绍

在做开发的时候,很多数据都是以Json格式传输的,而使用Json的时候,我们通常会涉及到几个序列化对象的使用:

  • System.Runtime.Serialization.Json.DataContractJsonSerializer
  • System.Web.Script.Serialization.JavaScriptSerializer
  • Json.NET即Newtonsoft.Json
    由于Json.NET的性能及通用性较好,因此它的使用范围越来越广,借助前人的经验今天我也总结使用一下。
    官网API:http://www.newtonsoft.com/json/help/html/N_Newtonsoft_Json.htm




基本用法

Json.Net是支持序列化和反序列化DataTable、DataSet、Entity Framework和Entity的

private void Newtonsoft() { DataTable dt = new DataTable(); dt.Columns.Add("Name", Type.GetType("System.String")); dt.Columns.Add("Sex", Type.GetType("System.String")); dt.Columns.Add("Age", Type.GetType("System.Int32")); dt.Columns.Add("PhoneNumber", Type.GetType("System.String")); for (int i = 0; i < 3; i++) { DataRow dr = dt.NewRow(); dr["Name"] = "Name" + i; dr["Sex"] = i % 2 == 0 ? "女" : "男"; dr["Age"] = 18 + i; dr["PhoneNumber"] = ""; dt.Rows.Add(dr); } /*序列化DataTable*/ string json = JsonConvert.SerializeObject(dt); /*反序列化DataTable*/ DataTable dtSource = JsonConvert.DeserializeObject 
  
    (json) 
   ; foreach (DataRow item 
   in dtSource 
   .Rows) { string name = item[ 
   "Name"] 
   .ToString() 
   ; string sex = item[ 
   "Sex"] 
   .ToString() 
   ; int age = int 
   .Parse(item[ 
   "Age"] 
   .ToString()) 
   ; string phoneNumber = item[ 
   "PhoneNumber"] 
   .ToString() 
   ; } } 
  

不创建新类型对json字符串反序列化

可以利用JObject 对象实现通过[]来读取对象中的属性的功能。

private void TestHttpHelper() { string url = "http://openapi.tencentyun.com/v3/user/get_info"; string data = "openid=BBA065E01CB73FFE96FA&" + "openkey=5F154D7D2751AEDCF290F70297B7EC&" + "appid=2&" + "sig=VrN%2BTn5J%2Fg4IIo0egUdxq6%2B0otk%3D&" + "pf=qzone&" + "format=json&" + "userip=112.90.139.30"; string result = HttpHelper.HttpGet(url + "?" + data); JObject obj = JsonConvert.DeserializeObject 
  
    (result); 
   int int1 = Convert.ToInt32(obj[ 
   "ret"]); 
   string str1 = obj[ 
   "msg"].ToString(); } 
  

高级用法

  1. 忽略某些属性
  2. 默认值的处理
  3. 空值的处理
  4. 支持非公共成员
  5. 日期处理
  6. 自定义序列化的字段名称
  7. 动态决定属性是否序列化
参数 解释
OptOut 默认值,类中所有公共成员都会被序列化,如果不想被序列化,可以加特性JsonIgnore
OptIn 默认情况下,所有成员都不会被序列化,类中的成员只有加特性Json Property才会被序列化,当类的成员很多,但客户端仅仅需要一部分数据时很有用

只有Name和PhoneNumber

[JsonObject(MemberSerialization.OptIn)] public class Person { [JsonProperty] public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } public string Address { get; set; } [JsonProperty] public string PhoneNumber { get; set; } }

这里写图片描述
不要性别、住址、手机号

[JsonObject(MemberSerialization.OptOut)] public class Person { public string Name { get; set; } [JsonIgnore] public string Sex { get; set; } public int Age { get; set; } [JsonIgnore] public string Address { get; set; } [JsonIgnore] public string PhoneNumber { get; set; } }

这里写图片描述
二、默认值处理
序列化时想忽略默认值属性可以通过JsonSerializerSettings.DefaultValueHanding来设置,该值为枚举值




参数 解释
DefaultValueHanding.Ignore 序列化和反序列化时,忽略没赋值的属性
DefaultValueHanding.Include 序列化和反序列化时,包含没赋值的属性
public class Person { public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } public string Address { get; set; } public string PhoneNumber { get; set; } }
public class Person { public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } [JsonProperty(NullValueHandling=NullValueHandling.Ignore)] public string Address { get; set; } public string PhoneNumber { get; set; } }

这里写图片描述
四、支持非公共成员
序列化时默认都是只处理公共成员,如果需要处理非公共成员,就要在该成员上加特性”JsonProperty”。
private不加JsonProperty:






public class Person { public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } public string Address { get; set; } public string PhoneNumber { get; set; } private int Wife { get; set; } public Person() { Wife = 3; } }

这里写图片描述
private加JsonProperty:

public class Person { public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } public string Address { get; set; } public string PhoneNumber { get; set; } [JsonProperty] private int Wife { get; set; } public Person() { Wife = 3; } }

这里写图片描述
五、日期处理
DateTime类型属性的处理稍微麻烦点,系统默认格式化为iso日期标准,




public class Person { public string Name { get; set; } public string Sex { get; set; } public DateTime Birthday { get; set; } }

这里写图片描述

public class Person { public string Name { get; set; } public string Sex { get; set; } [JsonConverter(typeof(IsoDateTimeConverter))] public DateTime Birthday { get; set; } }

但实际使用过程中大多数使用的可能是yyyy-MM-dd或yyyy-MM-dd HH:mm:ss这两种格式的日期,解决办法可以是将DateTime类型转成string类型自己先格式化然后再序列化。其次,Json.Net提供了IsoDateTimeConvert日期转换这个类,可以通过JsonConverter实现相应的日期转换,效果跟不加JsonConverter是一样的,在此就不截图了,但这明显不是我们想要的结果,我们可以继承该类实现自己的日期格式

public class Person { public string Name { get; set; } public string Sex { get; set; } [JsonConverter(typeof(ChinaDateTimeConcerter))] public DateTime Birthday { get; set; } } public class ChinaDateTimeConcerter : DateTimeConverterBase { private static IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" }; public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return dtConverter.ReadJson(reader, objectType, existingValue, serializer); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { dtConverter.WriteJson(writer, value, serializer); } }

这里写图片描述
这样自己就实现了一个yyyy-MM-dd日期格式化转换类,如果需要yyyy-MM-dd HH:mm:ss日期格式自己也可以很容易实现了。
六、自定义序列化字段的名称
实体类中定义的属性名可能不是自己想要的名称,但是不能更改实体定义,这个时候可以自定义序列化字段的名称。






public class Person { public string Name { get; set; } [JsonProperty(PropertyName = "MySex")] public string Sex { get; set; } [JsonProperty(PropertyName = "MyAge")] public int Age { get; set; } } 
public class Person { public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } public string Address { get; set; } public string PhoneNumber { get; set; } } public class LimitPropsContractResolver : DefaultContractResolver { string[] props = null; public LimitPropsContractResolver(string[] props) { //指定要序列化属性的清单 this.props = props; } protected override IList 
   
   CreateProperties(Type type, MemberSerialization memberSerialization) { IList 
   
     list = 
    base.CreateProperties(type, memberSerialization); 
    //只保留清单列出的属性 
    return list.Where(p => props.Contains(p.PropertyName)).ToList(); } } 
    
  

总结

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228026.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午7:59
下一篇 2026年3月16日 下午8:00


相关推荐

  • 程序员的财务自由之路(一)- 扬帆起航

    程序员的财务自由之路(一)- 扬帆起航程序员的财务自由之路

    2022年7月25日
    12
  • Linux EXT4文件系统简介

    Linux EXT4文件系统简介在先前有关 Linux 文件系统的文章中 我写了 Linux 文件系统的介绍以及一些更高级的概念 例如 一切都是文件 我想更详细地了解 EXT 文件系统的细节 但是首先让我们回答以下问题 什么是文件系统 文件系统包括以下所有内容 数据存储 任何文件系统的主要功能都应该是存储和检索数据的结构化场所 命名空间 一种命名和组织方法 提供命名和结构化数据的规则 安全模型 一种用于定

    2026年3月18日
    1
  • 【C#】list 去重(转载)

    【C#】list 去重(转载)一、查阅文档Enumerable.Distinct方法是常用的LINQ扩展方法,属于System.Linq的Enumerable方法,可用于去除数组、集合中的重复元素,还可以自定义去重的规则。有两个重载方法:////摘要://通过使用默认的相等比较器对值进行比较返回序列中的非重复元素。////参数://source://要从中移除重复元素的序列。.

    2022年5月25日
    72
  • Unity3D开发入门教程(一)——搭建开发环境[通俗易懂]

    Unity3D开发入门教程(一)——搭建开发环境[通俗易懂]五邑隐侠,本名关健昌,12年游戏生涯。本教程以Unity3D+VSCode+C#+xlua为例。一、安装Unity1、从官网下载UnityHub:https://uni

    2022年7月3日
    59
  • http请求过程图解_性能优化的方法

    http请求过程图解_性能优化的方法之前有整理过一部分知识点,一直没有发布,因为都是有关CSS方面的零散内容;现在想想无论做什么都需要慢慢积累,所以还是决定将之前整理的相关内容验证之后慢慢分享给你们,现在看到感觉还挺有意思。好了废话不多说,直接上代码以及图例(为了让大家方便阅读,都有自己验证过程的一些图片作为分享)。1.什么是Web前端1.Web前端本质上是一种GUI软件,可以直接借鉴其它GUI软件系统架构设计方法。1.什么是GUI软件?1.图形化用户界面:

    2026年4月16日
    8
  • Java 泛型方法/接口、泛型限定

    Java 泛型方法/接口、泛型限定文章目录

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号