JSON.NET基本使用
序列化一个对象
public static string ToJson( object obj) { string json = JsonConvert .SerializeObject(obj); return json; }
反序列化一个字符串到对象
string json = @"{ ""Name"": ""Apple"", ""Expiry"": new Date(1230422400000), ""Price"": 3.99, ""Sizes"": [ ""Small"", ""Medium"", ""Large"" ] }"; JObject o = JObject.Parse(json); string name = (string)o["Name"]; // Apple JArray sizes = (JArray)o["Sizes"]; string smallest = (string)sizes[0]; // Small
json.net中的时间处理
json序列化DateTime对象时,输入的格式是这样的 \/Date(1377853149258+0800)\/ 。可读性不好,使用开源库Json.Net时可以解决这一问题。
使用Json.Net的默认序列化输入也是\/Date(1377853149258+0800)\/ 。但Json.Net提供了2个JsonConverter,可以对时间进行格式化输出:IsoDateTimeConverter 和JavaScriptDateTimeConverter 。
如果对这2个converter的输出还不满意,可以自定义时间的格式化输出。如下是代码示例:
public class TestClass { public string Name { get; set; } public DateTime Date { get; set; } } public class class1 { public void Test001() { TestClass obj = new TestClass() { Name = "name", Date = DateTime.Now }; //标准格式 Console.WriteLine(JsonConvert.SerializeObject(obj)); //isoDateTime格式格式 Console.WriteLine(JsonConvert.SerializeObject(obj, new IsoDateTimeConverter())); //JavaScriptDateTime格式 Console.WriteLine(JsonConvert.SerializeObject(obj, new JavaScriptDateTimeConverter())); //自定义时间格式 IsoDateTimeConverter iso = new IsoDateTimeConverter(); iso.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.ffff"; Console.WriteLine(JsonConvert.SerializeObject(obj, iso)); } }
------ Test started: Assembly: Alibaba.Outsource.Domain.Application.Tests.dll ------
{"Name":"name","Date":"\/Date(1377853149258+0800)\/"}
{"Name":"name","Date":"2013-08-30T16:59:09.2583668+08:00"}
{"Name":"name","Date":new Date(1377853149258)}
{"Name":"name","Date":"2013-08-30 16:59:09.2583"}
1 passed, 0 failed, 0 skipped, took 0.32 seconds (Ad hoc).
如下是反序列化过程:
public void Test002() { TestClass obj = new TestClass() { Name = "name", Date = DateTime.Now }; //标准格式 string defaultString = JsonConvert.SerializeObject(obj); //Console.WriteLine(defaultString); //isoDateTime格式格式 string isoString = JsonConvert.SerializeObject(obj, new IsoDateTimeConverter()); //Console.WriteLine(isoString); //JavaScriptDateTime格式 string javaScriptString = JsonConvert.SerializeObject(obj, new JavaScriptDateTimeConverter()); //Console.WriteLine(javaScriptString); //自定义时间格式 IsoDateTimeConverter iso = new IsoDateTimeConverter(); iso.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.ffff"; string customString = JsonConvert.SerializeObject(obj, iso); Console.WriteLine(customString); //参数中带JsonConverter TestClass obj2 = JsonConvert.DeserializeObject<TestClass>(customString, iso); Console.WriteLine(obj2.Name); Console.WriteLine(obj2.Date); //参数中不带JsonConverter TestClass obj3 = JsonConvert.DeserializeObject<TestClass>(customString); Console.WriteLine(obj3.Name); Console.WriteLine(obj3.Date); }
输出:当时间格式是yyyy-MM-dd HH:mm:ss.ffff时,参数中带和不带jsonConverter都是可以成功序列化的
------ Test started: Assembly: Alibaba.Outsource.Domain.Application.Tests.dll ------
{"Name":"name","Date":"2013-08-30 17:12:47.5933"}
name
2013/8/30 17:12:47
name
2013/8/30 17:12:47
1 passed, 0 failed, 0 skipped, took 0.36 seconds (Ad hoc).
那是不是所有的自定义时间格式,在反序列化时,都可以不用带JsonConverter呢?答案是否定的。
针对下面的2中自定义时间格式,如果反序列化时,参数中不带上我们自定义的JsonConverter,第一个是可以的。第二个是不行的。当反序列化第二个时,会抛出异常。
iso2.DateTimeFormat = "yyyy年MM月dd日 HH时mm分ss秒";//可以正常反序列化
iso3.DateTimeFormat = "yyyy年哈哈MM月哈哈dd日哈哈 HH哈哈mm哈哈ss哈哈" ;//反序列化时抛出异常
可见,如果自定义的时间格式,刚好是C#可以解析的标准格式,那么可以在反序列化的时候,不用加上自定义Converter。否则,需要加上Converter。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?