首先去下载最新的Newtonsoft.Json.dll
https://github.com/JamesNK/Newtonsoft.Json
https://github.com/JamesNK/Newtonsoft.Json/releases
Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单。通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的.Net对象。让你轻松实现.Net中所有类型(对象,基本数据类型 等)和Json的转换。
Json.NET基础用法
序列化、反序列化实体类(将实体类对象序列化为Json字符串)
/// <summary>
/// 实体类
/// </summary>
public class Pat_Info
{
public string Name { get; set; }
public int Age { get; set; }
public string CardNo { get; set; }
}
//序列化
private void button1_Click(object sender, EventArgs e)
{
List<Pat_Info> pat_list = new List<Pat_Info>();
//实例类赋值
for (int i = 0; i < 10; i++)
{
Pat_Info pat1 = new Pat_Info
{
Name = "赵赵"+i,
Age = 25+i,
CardNo = "0000000"+i
};
pat_list.Add(pat1);
}
//序列化
string jsonStr = JsonConvert.SerializeObject(pat_list, Formatting.Indented);
textBox1.Text = jsonStr;
}
//反序列化
private void button2_Click(object sender, EventArgs e)
{
//Json字符串
List<Pat_Info> pat_list = new List<Pat_Info>();
string jsonStr = textBox1.Text;
//反序列化
pat_list = JsonConvert.DeserializeObject<List<Pat_Info>>(jsonStr);
for (int i = 0; i < pat_list.Count; i++)
{
textBox1.Text += "\r\n"+ pat_list[i].Age.ToString() + "|" + pat_list[i].Name + "|" + pat_list[i].CardNo+"\r\n";
}
}
序列化与反序列化时属性使用
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/// <summary>
/// zhao.fw
/// </summary>
namespace Json.NET
{
/// <summary>
/// 实体类
/// </summary>
public class Pat_Info
{
public string Name { get; set; }
public int Age { get; set; }
public string CardNo { get; set; }
}
/* 序列化与反序列化时忽略某些属性
* 1、忽略类内所有属性
* [JsonObject(MemberSerialization.OptIn)]用于在序列化与反序列化时忽略一个类里所有的属性,
* 只有当在类内属性上打特性标签[JsonProperty]时才支持序列化与反序列化。
* 所以[JsonObject(MemberSerialization.OptIn)]常用于与[JsonProperty]配合使用。
*/
[JsonObject(MemberSerialization.OptIn)]
public class Pat_Info_01
{
public string Name { get; set; }
[JsonProperty]
public int Age { get; set; }
public string CardNo { get; set; }
}
/*2、序列化所有属性(默认)
* 默认实体类上默认打着[JsonObject(MemberSerialization.OptOut)]特性标签(可以省略不写),
* 如果要忽略某些属性,要在属性上打[JsonIgnore]。
*/
[JsonObject(MemberSerialization.OptOut)]
public class Pat_Info_02
{
public string Name { get; set; }
[JsonIgnore]
public int Age { get; set; }
public string CardNo { get; set; }
}
/*
* 默认值处理
* 设置属性默认值
* 在属性上打 [DefaultValue("xxx")]
*/
public class Pat_Info_03
{
public string Name { get; set; }
[System.ComponentModel.DefaultValue("20")]
public int Age { get; set; }
public string CardNo { get; set; }
}
/*空值处理
*/
public class Pat_Info_04
{
//不序列化为null的属性
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Name { get; set; }
public int Age { get; set; }
public string CardNo { get; set; }
}
/* 序列化私有成员
* 因为默认只序列化public的成员,所以如果想序列化private成员,要在实体类的属性上打[JsonProperty]标签。
*/
public class Pat_Info_05
{
public string Name { get; set; }
[JsonProperty]
private int Age { get; set; }
public string CardNo { get; set; }
}
/*自定义序列化名称
* 在序列化与反序列化时可以自定义序列化出字符串的属性名称,
* 如下代码可以将实体类的Name属性序列化为PatName属性,并且可以将Json中的PatName反序列化为当前实体类的Name属性。(双向)
*/
public class Pat_Info_06
{
[JsonProperty(PropertyName = "PatName")]
public string Name { get; set; }
public int Age { get; set; }
public string CardNo { get; set; }
}
/*日期处理
* 解决方案1:在可以动Model代码的情况下
* 系统自带的DateTime会格式化成iso日期标准,
* 但是实际使用过程中大多数使用的可能是yyyy-MM-dd 或者yyyy-MM-dd HH:mm:ss两种格式的日期,
* 解决办法是可以将DateTime类型改成string类型自己格式化好,然后在序列化。
*
* 代码思路是不去序列化StartTime属性,而去序列化string类型的m_StartTime属性(m_StartTime相当于StartTime属性的私有字段)。
*/
public class Pat_Info_07
{
[JsonProperty(PropertyName = "PatName")]
public string Name { get; set; }
public int Age { get; set; }
public string CardNo { get; set; }
[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");//这里写自己想要的格式
}
}
}
/* 日期处理
* 解决方案2:使用DateTimeConverterBase
* Json.Net提供了IsoDateTimeConverter日期转换这个类,可以通过JsnConverter实现相应的日期转换
*
*/
public class Pat_Info_08
{
[JsonProperty(PropertyName = "PatName")]
public string Name { get; set; }
public int Age { get; set; }
public string CardNo { get; set; }
//但是IsoDateTimeConverter日期格式(yyyy-MM-ddTHH:mm:ss)不是我们想要的,我们可以继承该类实现自己的日期
[JsonConverter(typeof(Newtonsoft.Json.Converters.IsoDateTimeConverter))]
public DateTime Birthday { get; set; }
[JsonConverter(typeof(ChinaDateTimeConverter))]
public DateTime Birthday2 { get; set; }
}
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);
}
}
/**/
public class Pat_Info_09
{
[JsonProperty(PropertyName = "PatName")]
public string Name { get; set; }
public int Age { get; set; }
public string CardNo { get; set; }
}
}
以驼峰命名法序列化
private void button3_Click(object sender, EventArgs e)
{
Pat_Info_03 pat1 = new Pat_Info_03
{
Name = "赵赵",
Age = 25,
CardNo = "00000001"
};
JsonSerializerSettings setting = new JsonSerializerSettings();
//这样子的话,在序列实体类对象pat1的属性时,属性名称将由CardNo转换为cardNo。
setting.ContractResolver = new CamelCasePropertyNamesContractResolver();
string jsonStr = JsonConvert.SerializeObject(pat1,Formatting.Indented, setting);
textBox1.Text = jsonStr;
}
将多个数据类型序列化为1个Json对象(序列化匿名类)
private void button4_Click(object sender, EventArgs e)
{
/* 将多个数据类型序列化为1个Json对象(序列化匿名类)
* 有时我们有这样的需求,对方要求我们传输过去的Json字符串要包含我们多个实体类型的信息,笨方法就是重新构建一个符合要求的实体类型,
* 但是我们又更好的方法,我们可以使用匿名类,把Json需要的信息均放在匿名类中,我们可以对匿名类进行序列化。
*/
List<Pat_Info> list1 = new List<Pat_Info>();
//实例类赋值
for (int i = 0; i < 5; i++)
{
Pat_Info pat1 = new Pat_Info
{
Name = "赵赵" + i,
Age = 25 + i,
CardNo = "0000000" + i
};
list1.Add(pat1);
}
List<Pat_Info_09> list2 = new List<Pat_Info_09>();
for (int i = 0; i < 5; i++)
{
Pat_Info_09 pat2 = new Pat_Info_09
{
Name = "张张" + i,
Age = 25 + i,
CardNo = "0000000" + i
};
list2.Add(pat2);
}
List<string> info = new List<string>() { "赵赵", "北京" };
var json = new { information = info, jsonList1 = list1, jsonList2 = list2 };
//开始序列化
string jsonStr = JsonConvert.SerializeObject(json, Formatting.Indented);
textBox1.Text = jsonStr;
}