【问题标题】:Deserialize a single DateTime object with JsonConvert使用 JsonConvert 反序列化单个 DateTime 对象
【发布时间】:2018-05-25 06:15:00
【问题描述】:

上下文

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 变量和正确的值。我怎样才能完成这项任务?

【问题讨论】:

  • 如果序列化可以使用默认值,那么反序列化应该使用相同的默认值
  • 必须引用JSON 字符串文字,所以你需要做JsonConvert.DeserializeObject<DateTime>("\"2018-05-25T07:59:27.2175427+02:00\"")。很容易将 c# 字符串文字(不是 JSON 的 部分)的引号与需要包含在 JSON 字符串中的引号混淆。见dotnetfiddle.net/TgQ2cl
  • 谢谢,我试过了。这是一个真实的答案。你应该发布它。 (现在我记得,曾经我学到了同样的一课:-),但似乎重复是所有知识的母亲。)

标签: c# json datetime json.net


【解决方案1】:

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

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

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

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

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

小提琴样本here.

【讨论】:

    【解决方案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");
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      相关资源
      最近更新 更多