Newtonsoft—Json.NET常用方法简述
Json.NET常用方法汇总(可解决日常百分之90的需求)
0.Json.NET基础用法
首先去官网下载最新的Newtonsoft.Json.dll(也可以使用VS自带的NuGet搜索Json.NET下载(下载下图第二个))并引用至项目。

- (1)序列化实体类(将实体类对象序列化为Json字符串)
using System;
using Newtonsoft.Json; namespace Json_NET_Test
{
/// <summary>
/// 定义一个实体类
/// </summary>
public class Student
{
public string Name;
public int Age;
public string Class;
}
class Program
{
static void Main(string[] args)
{
//创建实体类对象
Student stu = new Student
{
Name = "老王",
Age = ,
Class = "三班"
};
//开始序列化
string jsonStr = JsonConvert.SerializeObject(stu, Formatting.Indented);
Console.WriteLine(jsonStr);
}
}
}
结果:

- (2)反序列化(将Json字符串反序列化为实体类对象)
using System;
using Newtonsoft.Json; namespace Json_NET_Test
{
/// <summary>
/// 定义一个实体类
/// </summary>
public class Student
{
public string Name;
public int Age;
public string Class;
}
class Program
{
static void Main(string[] args)
{
//Json字符串
string jsonStr = "{\"Name\": \"老王\",\"Age\": 99,\"Class\": \"三班\"}";
//开始反序列化
Student stu = JsonConvert.DeserializeObject<Student>(jsonStr);
}
}
}
1.序列化与反序列化时忽略某些属性
- (1)忽略类内所有属性
[JsonObject(MemberSerialization.OptIn)]用于在序列化与反序列化时忽略一个类里所有的属性,只有当在类内属性上打特性标签[JsonProperty]时才支持序列化与反序列化。所以[JsonObject(MemberSerialization.OptIn)]常用于与[JsonProperty]配合使用。
例:
[JsonObject(MemberSerialization.OptIn)]
public class Person
{
public int Age { get; set; } [JsonProperty]
public string Name { get; set; } public string Sex { get; set; } public bool IsMarry { get; set; } public DateTime Birthday { get; set; }
}
- (2)序列化所有属性(默认)
默认实体类上默认打着[JsonObject(MemberSerialization.OptOut)]特性标签(可以省略不写),如果要忽略某些属性,要在属性上打[JsonIgnore]。
例:
[JsonObject(MemberSerialization.OptOut)]
public class Person
{
public int Age { get; set; } public string Name { get; set; } public string Sex { get; set; } [JsonIgnore]
public bool IsMarry { get; set; } public DateTime Birthday { get; set; }
}
- (3)动态控制实体类属性的是否忽略序列化(默认)
当某些条件下需要序列化A属性和B属性,某些情况下需要忽略A属性与B属性,我们该怎么做?
答:使用JsonSerializerSettings设置某实体类对象要忽略序列化的属性(配合if与else控制属性的动态忽略)。
例:以下方式忽略p对象的Age属性与IsMarry属性:
JsonSerializerSettings jsetting=new JsonSerializerSettings();
jsetting.ContractResolver = new LimitPropsContractResolver(new string[] { "Age", "IsMarry" });
Console.WriteLine(JsonConvert.SerializeObject(p, Formatting.Indented, jsetting));
2.默认值处理
- (1)设置属性默认值
在属性上打 [DefaultValue("xxx")]
3.空值处理
- (1)不序列化为null的属性(使用JsonSerializerSettings方式)
Person p = new Person
{
room = null,
Age = ,
Name = "张三丰",
Sex = "男",
IsMarry = false,
Birthday = new DateTime(, , )
};
JsonSerializerSettings jsetting=new JsonSerializerSettings();
jsetting.NullValueHandling = NullValueHandling.Ignore;
Console.WriteLine(JsonConvert.SerializeObject(p, Formatting.Indented, jsetting));
ps:使用这种方式可能bool为false的也无法序列,最后的结果只包含Birthday、Sex、Name、Age。
- (2)不序列化为null的属性(使用特性标签方式)
[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
public Room room { get; set; }
4.序列化私有成员
因为默认只序列化public的成员,所以如果想序列化private成员,要在实体类的属性上打[JsonProperty]标签。
[JsonProperty]
private int Height { get; set; }
5.自定义序列化名称
在序列化与反序列化时可以自定义序列化出字符串的属性名称,如下代码可以将实体类的Name属性序列化为CName属性,并且可以将Json中的CName反序列化为当前实体类的Name属性。(双向)
[JsonProperty(PropertyName = "CName")]
public string Name { get; set; }
6.日期处理
- (1)解决方案1:在可以动Model代码的情况下
系统自带的DateTime会格式化成iso日期标准,但是实际使用过程中大多数使用的可能是yyyy-MM-dd 或者yyyy-MM-dd HH:mm:ss两种格式的日期,解决办法是可以将DateTime类型改成string类型自己格式化好,然后在序列化。
例:
[JsonProperty(PropertyName = "startTime")]//因为默认只序列化public属性,所以要打上JsonProperty标签并且声明名称
private string m_StartTime{get;set;} [JsonIgnore]//这个标签用于在序列化与反序列化时忽略StartTime属性
public DateTime StartTime
{
get{ return Convert.ToDateTime(m_StartTime); }
set
{
DateTime time = value;
m_StartTime = time.ToString("yyyy-MM-dd");//这里写自己想要的格式
}
}
ps:代码思路是不去序列化StartTime属性,而去序列化string类型的m_StartTime属性(m_StartTime相当于StartTime属性的私有字段)。
- (2)解决方案2:使用DateTimeConverterBase
Json.Net提供了IsoDateTimeConverter日期转换这个类,可以通过JsnConverter实现相应的日期转换
[JsonConverter(typeof(IsoDateTimeConverter))]
public DateTime Birthday { get; set; }
但是IsoDateTimeConverter日期格式(yyyy-MM-ddTHH:mm:ss)不是我们想要的,我们可以继承该类实现自己的日期
例:
public class ChinaDateTimeConverter : 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);
}
}
使用方式:
[JsonConverter(typeof(ChinaDateTimeConverter))]
public DateTime Birthday { get; set; }
7.以驼峰命名法序列化
有时我们会碰到这种需求,比如我们代码里实体类型的属性名称均是以大写字母开头,如Name、StartTime等,但是要求我们序列出的Json字符串的属性名称要以小写字母开头,如name、startTime、endTime等。我们可以使用如下代码解决
JsonSerializerSettings setting = new JsonSerializerSettings();
setting.ContracResolver = new CamelCasePropertyNamesContractResolver();
string jsonStr = JsonConvert.Serializeobject(p, Newtonsoft.json.Formatting.Indented, setting);
这样子的话,在序列实体类对象p的属性时,属性名称将由PersonName转换为personName。
8.枚举的序列化
枚举默认序列化为枚举的Int值,如果想要序列化为枚举string值,使用如下方式
9.将多个数据类型序列化为1个Json对象(序列化匿名类)
有时我们有这样的需求,对方要求我们传输过去的Json字符串要包含我们多个实体类型的信息,笨方法就是重新构建一个符合要求的实体类型,但是我们又更好的方法,我们可以使用匿名类,把Json需要的信息均放在匿名类中,我们可以对匿名类进行序列化。
例:
List<Model> list1 = new List<Model>();
List<Model2> list2 = new List<Model2>();
string name = "名字";
string address = "xx";
List<string> info = new List<string>() { name, address };
var json = new { information = info, jsonList1 = list1, jsonList2 = list2 };
我们只需要对上面的匿名对象“json”序列化即可。
10.使用JsonConverter自定义属性序列化规则(json格式转换器)
- (1)将属性值由double类型序列化时转为字符串类型
public class DoubleToStringConverter : JsonConverter
{
//表示反序列化时不执行该转换器
public override bool CanRead => false;
//表示序列化时执行该转换器
public override bool CanWrite => true; //判断执行条件(当属性的值为double类型时才使用转换器)
public override bool CanConvert(Type objectType)
{
return objectType == typeof(double);
} //因为public override bool CanRead => false;,所以不用实现反序列化时的转换方法
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
} /// <summary>
/// 序列化时执行的转换
/// </summary>
/// <param name="writer">可以用来重写值</param>
/// <param name="value">属性的原值</param>
/// <param name="serializer">就是那个serializer对象</param>
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
double v = (double)value;
writer.WriteValue(v.ToString());
}
}
使用方式:
[JsonConverter(typeof(DoubleToStringConverter))]
public double Count{get;set;}
ps:这样子,就可以把原本序列化出的Json字符串 Count : 12.3 转化为 Count : "12.3"
ps:[JsonConverter(typeof(DoubleToStringConverter))]也可以打在类上,表示全局设置
- (2)枚举转换为int字符串
为什么要进行这样的转换呢?
因为枚举类型在序列化时默认序列化为枚举的int类型,即如下代码:
/// <summary>
/// 自定义一个枚举类型
/// </summary>
public enum MyEnum
{
aaa = ,
bbb = ,
ccc =
}
/// <summary>
/// 实体类(类内有一个枚举类型的属性MyEnumProp)
/// </summary>
public class Person
{
public MyEnum MyEnumProp { get; set; }
}
class Program
{ static void Main(string[] args)
{
Person p = new Person() { MyEnumProp = MyEnum.ccc };
//Json字符串
string jsonStr = JsonConvert.SerializeObject(p);
//开始反序列化
Console.WriteLine(jsonStr);
Console.ReadLine();
}
}
结果为:

有时候会有这样的需求,序列化出的属性值均要为字符串格式,即要将上图结果的3改为"3"。这时候就需要自定义转换了!
代码如下:
public class EnumToIntStringConverter : JsonConverter
{
//反序列化时不执行
public override bool CanRead => false;
//序列化时执行
public override bool CanWrite => true; //控制执行条件(当属性的值为枚举类型时才使用转换器)
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Enum);
} //因为public override bool CanRead => false;,所以不用实现反序列化时的转换方法
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
} /// <summary>
/// 序列化时执行的转换
/// </summary>
/// <param name="writer">可以用来重写值</param>
/// <param name="value">属性的原值</param>
/// <param name="serializer">就是那个serializer对象</param>
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
Enum e = (Enum)value;
int v = Convert.ToInt32(e);
writer.WriteValue(v.ToString());
}
}
使用方法同上例。
Newtonsoft—Json.NET常用方法简述的更多相关文章
- Newtonsoft.Json.Linq 常用方法总结
目录 1.Entity to Json 1.1.准备工作 1.2.Entity to Json 1.3.Json to Entity 2.Linq To Json 2.1.创建对象 2.2.从 Jso ...
- Newtonsoft.Json的使用整理
关于我 我的博客 | 欢迎关注 引言 json是我们在工作中经常用到的一种数据传输格式,开始过程中解析json是我们经常面对的问题.NewtonsoftJson是c#的一套json处理封装类,它可以高 ...
- .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程
JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询 ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- Newtonsoft.Json 自定义 解析协议
在开发web api的时候 遇到一个要把string未赋值默认为null的情况改成默认为空字符串的需求 这种情况就需要自定义json序列话的 解析协议了 Newtonsoft.Json默认的解析协议是 ...
- Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b9a188c8922137c6
未能加载文件或程序集“Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b9a188c8922137c6”或它的某一个 ...
- Newtonsoft.Json 序列化和反序列化 时间格式【转】
1.JSON序列化 string JsonStr= JsonConvert.SerializeObject(Entity); eg: A a=new A(); a.Name="Elain ...
- Newtonsoft.Json 版本冲突解决
在做asp.net MVC 开发时,因为引用的dll 中使用了更高版本的 Newtonsoft.Json ,导致运行时发生错误, 查资料说是因为webApi使用了Newtonsoft.Json 导致了 ...
- JsonHelper developed by using Newtonsoft.Json.NET, Deserialize to <T> object , XmlToJson/JsonToXml, QuoteName by using JToken Path.
namespace TestConsoleApplication { using System; using System.Diagnostics; using System.Threading; u ...
随机推荐
- Cocos Creator实现左右跳游戏
1. 玩法说明 游戏开始后,点击屏幕左右两侧,机器人朝左上方或右上方跳一步,如果下一步有石块,成功得1分,否则游戏结束. 2. 模块介绍 游戏场景分为2个:主页场景(home).游戏场景(game) ...
- Django REST Framework之频率限制
开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用 使用 自定义频率限制组件:utils/thottle.py class MyThrottle(BaseThrottle): ...
- 性能测试:Jmeter-Beanshell请求加密实例
进行性能测试时,有可能遇到一种场景:接口请求由于安全问题,需要进行加密发送. 这种场景下,使用Jmeter实现性能测试,则也需要使用同样的加密规则发送请求报文. 要实现此类性能测试有几种策略: 直接去 ...
- frp 端口映射
简介 frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透. 场景 利用处于内网或防火墙后 ...
- 基于 HTML5 和 WebGL 的地铁站 3D 可视化系统
前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...
- 使用tomcat7发布war项目启动org_apache_tomcat_websocket报错
在使用tomcat7发布项目时(项目是用springboot 2.1.4.RELEASE版本开发的) 换成tomcat8就可以正常发布了,网上说tomcat7不支持servlet3.1,升级到spri ...
- git 查看日志记录
1.git log 如果日志特别多的话,在git bash中,按向下键来查看更多,按q键退出查看日志. 2.git show 查看最近一次commit内容,也可以后面加commit号,单独查看此次版本 ...
- 一个随意list引发的惨案(java到底是值传递还是引用 传递?)
前两天写了一个递归,因为太年轻,把一个递归方法需要用到的list定义该递归方法外了,结果开始断点测试的时候有点小问题 ,然后上线之后因为数据量太多导致了一个java.util.ConcurrentMo ...
- MongoDB 学习笔记之 匹配完整数组
匹配完整数组: 创建一个集合(包含数组) db.ArrayTest.insert({name: "Sky" , address: [{"street" : &q ...
- group by 如何合并字符串优化记?
sqlserver 2005及以上版本 表(tb) id value 1 aa 2 cc 3 bb 3 dd 4 aa 4 cc 4 dd ...