使用JsonConvert

时间:2018-05-25 06:15:00

标签: c# json datetime json.net

上下文

JsonConvert.SerializeObject(DateTime.Now)给出以下结果:

  

“2018-05-25T07:59:27.2175427 + 02:00”

但是当我尝试使用以下行代码将此JSON字符串反序列化为DateTime时:JsonConvert.DeserializeObject<DateTime>("2018-05-25T07:59:27.2175427+02:00")

它为Newtonsoft.Json.JsonReaderException提供以下消息:

  

解析值时遇到意外的字符:2。路径'',第1行,第1位。

到目前为止我还尝试了什么

  

“2018-05-25T07:59:27”

导致同样的异常

问题

使用JSON序列化格式的日期时间字符串,我希望有一个DateTime变量和正确的值。我怎样才能完成这项任务?

2 个答案:

答案 0 :(得分:3)

JSON standard所示,必须引用JSON字符串文字:

  

string是零个或多个Unicode字符的序列,用双引号括起来,使用反斜杠转义。字符表示为单个字符串。字符串非常类似于C或Java字符串。

     

enter image description here

因此,要成为有效的JSON,您的c#字符串文字必须包含周围的双引号,如下所示:

var dateTime = JsonConvert.DeserializeObject<DateTime>("\"2018-05-25T07:59:27.2175427+02:00\"");

很容易混淆最外层的引号,这些引号是c#语言的一部分,并在c#代码中分隔字符串,但不包含在字符串本身中,内部引号是字符串文字本身的一部分。 / p>

示例小提琴here

答案 1 :(得分:2)

问题是JsonConvert.DeserializeObject看起来好像需要JSON 对象而不是任何JSON 。 (遗憾的是SerializeObject并不总是产生一个对象,但是......)

您可以像这样解析它:

DateTime dt = new JValue("2018-05-25T07:59:27.2175427+02:00").ToObject<DateTime>();

或(等效?我不完全确定):

DateTime dt = (DateTime) new JValue("2018-05-25T07:59:27.2175427+02:00");

可能有更好的方法,但这至少有效。