安装 Newtonsoft.Json
Install-Package Newtonsoft.Json
常用using
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
序列化
//序列化 对象 -> JSON 字符串
string json = JsonConvert.SerializeObject(object);
//分序列化 JSON 字符串 -> 对象
var jsonObj = JsonConvert.DeserializeObject<object>(json);
int[] arr = JsonConvert.DeserializeObject("[1,2,3]", typeof(int[])) as int[];
通过对象直接获取字符串:复制对象,然后打开LINQPad 开,然后试用快捷键 Shfit+Alt+V 即可获取字符串。
--对象
{"code":0,"msg":"success","data":{"total":3,"details":{"codes":["1","2","3"]}}}
--字符串
"{\"code\":0,\"msg\":\"success\",\"data\":{\"total\":3,\"details\":{\"codes\":[\"1\",\"2\",\"3\"]}}}"
特性
[JsonProperty("student")]//重命名属性名
[JsonProperty(PropertyName = "student")]
[JsonIgnore]//序列化时忽略此字段
[DisplayName("学生")]
public string Student { get; set; }
配置
局部配置
JsonSerializerSettings jsonSerializerSettings= new JsonSerializerSettings();
jsonSerializerSettings.Formatting= Formatting.Indented;
var json = JsonConvert.SerializeObject(reportModel, jsonSerializerSettings);
全局配置
NuGet安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson
包
程序全局配置
JsonSerializerSettings setting = new JsonSerializerSettings();
JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
{
setting.Formatting = Formatting.Indented;
return setting;
});
API返回结果配置
builder.Services.AddControllers().AddNewtonsoftJson(options =>
{
//修改属性名称的序列化方式,首字母小写,即驼峰样式
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
//修改属性名称的序列化方式,蛇形命名,大写字母变小写+下划线。 比如:ProductName => product_name
options.SerializerSettings.ContractResolver = new DefaultContractResolver() { NamingStrategy = new SnakeCaseNamingStrategy() };
//字符串格式化
options.SerializerSettings.Formatting = Formatting.Indented;
//日期类型默认格式化处理 方式1
options.SerializerSettings.Converters.Add(new IsoDateTimeConverter() { DateTimeFormat = "yyyy/MM/dd HH:mm:ss" });
//日期类型默认格式化处理 方式2
options.SerializerSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
options.SerializerSettings.DateFormatString = "yyyy/MM/dd HH:mm:ss";
//忽略循环引用
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
//解决命名不一致问题
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
//忽略空值字段
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
//忽略默认值
options.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Ignore;
//包含默认值
options.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Include;
//多态反序列化
options.SerializerSettings.TypeNameHandling = TypeNameHandling.All;
});
常规用法
类型转换
常用类型
- BinaryConverter
- BsonObjectIdConverter
- CustomCreationConverter
- DataSetConverter
- DataTableConverter
- DateTimeConverterBase
- DiscriminatedUnionConverter
- EntityKeyMemberConverter
- ExpandoObjectConverter
- IsoDateTimeConverter
- JavaScriptDateTimeConverter
- KeyValuePairConverter
- RegexConverter
- StringEnumConverter
- UnixDateTimeConverter
- VersionConverter
- XmlNodeConverter
使用方式
- 字段添加:
[JsonConverter(typeof(DataTableConverter))]
- 配置添加:
JsonConvert.SerializeObject(dt, new DataTableConverter(), new DataSetConverter());
字段全部小写
var settings = new JsonSerializerSettings();
settings.ContractResolver = new LowercaseContractResolver();
var json = JsonConvert.SerializeObject(obj, Formatting.Indented, settings);
public class LowercaseContractResolver : DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
return propertyName.ToLower();
}
}
Double/Decimal移除小数点
Double
和Decimal
类型数据在序列化时会默认添加一个小数点并随0.比如1
赋值1.0
解决方案是自定义添加类型转换
/// <summary>
/// decimal格式化
/// </summary>
public class JsonConverterDecimal : JsonConverter
{
//是否可以转换
public override bool CanConvert(Type objectType)
{
return objectType == typeof(decimal) || objectType == typeof(decimal?);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.ValueType == null && reader.Value == null) return null;
decimal.TryParse(reader.Value != null ? reader.Value.ToString() : "", out decimal value);
return value.ToString("F2");
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(value == null ? value : value.ToString());
}
}
/// <summary>
/// double格式化
/// </summary>
public class JsonConverterDouble : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(double) || objectType == typeof(double?);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.ValueType == null && reader.Value == null) return null;
double.TryParse(reader.Value != null ? reader.Value.ToString() : "", out double value);
return value.ToString("F2");
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(value == null ? value : value.ToString());
}
}
在配置中添加
JsonSerializerSettings jsonSerializerSettings= new JsonSerializerSettings();
jsonSerializerSettings.Converters = new List<JsonConverter> { new JsonConverterDecimal(), new JsonConverterDouble() };
var json = JsonConvert.SerializeObject(reportModel, jsonSerializerSettings);
或者在字段中添加配置
[JsonConverter(typeof(JsonConverterDecimal))]
public decimal TotalNum { get; set; }
反向剔除
默认都不显示,手工指定要显示的,使用 MemberSerialization.OptIn
配合 JsonProperty
以下代码只会序列化ProductName
,其他字段都会忽略
[JsonObject(MemberSerialization.OptIn)]
public class ReportModel
{
[JsonProperty]
public string ProductName { get; set; }
public int ProductId1 { get; set; }
public int ProductId2 { get; set; }
public int ProductId3 { get; set; }
}
枚举返回字符串
默认情况下对于实体里面的枚举类型系统是格式化成改枚举对应的整型数值。在字段属性上加上JsonConverter(typeof(StringEnumConverter))
会将枚举值转换成对应的字符串
public class TestEnmu
{
[JsonConverter(typeof(StringEnumConverter))]
public NotifyType Type { get; set; }
}
public enum NotifyType
{
Mail = 0,
SMS = 1
}
多个json合并到一个Model
var reportModel = new ReportModel();
var json1 = "{'ProductName':'法式小众设计感长裙气质显瘦纯白色仙女连衣裙'}";
var json2 = "{'TotalCustomerCount':1000,'TotalPayment':100.0,'TotalProductCount':10000}";
JsonConvert.PopulateObject(json1, reportModel);
JsonConvert.PopulateObject(json2, reportModel);
public class ReportModel
{
public string ProductName { get; set; }
public int TotalCustomerCount { get; set; }
public decimal TotalPayment { get; set; }
public int TotalProductCount { get; set; }
}
验证JSON字符串
public static bool ValidateJSON(this string s)
{
try
{
Newtonsoft.Json.Linq.JToken.Parse(s);
return true;
}
catch
{
return false;
}
}
JObject、JArray、JProperty、JValue 的使用
- JObject用来生成一个JSON对象{}
- JArray用来生成一个JSON数组[]
- JProperty用来生成一个JSON数据key:value
- JValue则直接生成一个JSON值
创建json对象
把JObject理解为C#中的一个类,那么JProperty就是它的属性
案例1
var jObject = new
{
msg = "success",
data = new
{
total = 1,
diff = new int[3] { 1, 2, 3 }
}
};
Console.WriteLine(JsonConvert.SerializeObject(jObject));
输出:
/*
{
"msg": "success",
"data": {
"total": 1,
"diff": [1, 2, 3]
}
}
*/
案例2
var jobject = new JObject();
jobject.Add(new JProperty("name", "jack"));
jobject.Add(new JProperty("age", "28"));
jobject.Add(new JProperty("content", new JObject(new JProperty("hobby", "game"))));
Console.WriteLine(jobject);
输出:
/*
{
"name": "jack",
"age": "28",
"content": {
"hobby": "game"
}
}
*/
案例3
var jobject = new JObject { new JProperty("name", "renee"), new JProperty("age", 30) };
输出:
/*
{
"name": "renee",
"age": 30
}
*/
案例4
JArray array = new JArray();
array.Add("GongHui Linq");
array.Add(new DateTime(2015, 12, 14));
var jobject = new JObject();
jobject.Add(new JProperty("name", "jack"));
jobject.Add(new JProperty("age", "28"));
jobject.Add(new JProperty("content", new JObject(new JProperty("hobby", "game"))));
jobject["myArray"] = array;
var jarray = new JArray();
jarray.Add(jobject);
jarray.Add(new JObject(new JProperty("name", "renne")));
Console.WriteLine(jarray);
输出
/*
[
{
"name": "jack",
"age": "28",
"content": {
"hobby": "game"
},
"myArray": [
"GongHui Linq",
"2015-12-14T00:00:00"
]
},
{
"name": "renne"
}
]
*/
解析json对象
var json = "{\"msg\":\"success\",\"code\":200,\"data\":\"data\"}";
var jobject = JObject.Parse(json);
//获取msg对象的值
Console.WriteLine(jobject.Value<string>("msg"));
Console.WriteLine(jobject["msg"]);
//获取code对象的值
Console.WriteLine(jobject.GetValue("code"));
//判断对象是否存在
if (jobject.ContainsKey("code") && jobject.Value<string>("code").Equals("200"))
Console.WriteLine("true");
else
Console.WriteLine("false");
输出
/*
success
success
200
True
*/
案例2
//创建一个对象
var Object = new
{
code = 0,
msg = "success",
data = new
{
total = 3,
details = new { codes = new string[] { "1", "2", "3" } }
}
};
//对象转字符串
var json = JsonConvert.SerializeObject(Object);
//输出json
Console.WriteLine(json);
//解析对象
var jObject = JObject.Parse(json);
var jArray = JArray.Parse(jObject["data"]["details"]["codes"].ToString());
//JArray转换对象
var list = jArray.ToObject<string[]>();
foreach (var item in list)
Console.WriteLine(item);
输出
/*
{
"code": 0,
"msg": "success",
"data": {
"total": 3,
"details": {
"codes": ["1", "2", "3"]
}
}
}
1
2
3
*/
案例3
var json = @"{
'DisplayName': '新一代算法模型',
'CustomerType': 1,
'Report': {
'TotalCustomerCount': 1000,
'TotalTradeCount': 50
},
'CustomerIDHash': [1,2,3,4,5]
}";
var dict = JsonConvert.DeserializeObject<Dictionary<object, object>>(json);
var report = dict["Report"] as JObject;
var totalCustomerCount = report["TotalCustomerCount"];
Console.WriteLine($"totalCustomerCount={totalCustomerCount}");
var arr = dict["CustomerIDHash"] as JArray;
var list = arr.Select(m => m.Value<int>()).ToList();
Console.WriteLine($"list={string.Join(",", list)}");