序列化一个对象

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。

最新文章

  1. DNS原理及其解析过程 精彩剖析
  2. php采集远程图片
  3. HBase查找一条数据的过程
  4. android基础(六)android的消息处理机制
  5. 数据结构算法C语言实现(十)--- 3.3栈与递归的实现
  6. Delphi中record和packed record的区别
  7. mac上创建MySQL的基本步骤
  8. 节日EDM系列:圣诞节如何进行EDM数据营销
  9. 系统分区MBR、GPT
  10. 使用ContentObserve监听用户发出的短信
  11. hdu 2056
  12. Android开发实例详解之IMF(Android SDK Sample—SoftKeyboard)
  13. c语言学习之基础知识点介绍(十):数组
  14. poj 2388 Who&amp;#39;s in the Middle
  15. 理解JavaScript的立即调用函数表达式(IIFE)
  16. Ansible 系列之 Patterns
  17. nyoj137 取石子(三) 楼教主男人八题之一
  18. 周末班:Python基础之面向对象进阶
  19. css-过渡
  20. c# 一些细节

热门文章

  1. MySQL中游标使用以及读取文本数据
  2. html + CSS
  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明
  4. linux后台server开发环境的部署配置和验证(nginx+apache+php-fpm+FASTCGI(C/C++))
  5. ReportNG测试报告模板定制
  6. Ubuntu更改hosts档
  7. monoTouch for android visual studio c#开发
  8. javascritpt 原型链
  9. 【ThinkingInC++】66、pointer Stash的使用
  10. linux下mysql的远程连接