代码之家  ›  专栏  ›  技术社区  ›  g.pickardou

使用JsonConvert反序列化单个DateTime对象

  •  1
  • g.pickardou  · 技术社区  · 6 年前

    上下文

    生产线 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字符串,我希望 DateTime 变量及其正确值。我怎样才能完成这项任务?

    2 回复  |  直到 6 年前
        1
  •  3
  •   dbc    6 年前

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

    A. 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代码中分隔字符串,但不包括在字符串本身中,而最外面的引号是字符串文字本身的一部分。

    样品提琴 here

        2
  •  3
  •   Jon Skeet    6 年前

    问题是 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");
    

    也许有更好的方法,但至少是可行的。