63

这是代码:

        string s = "2012-08-08T01:54:45.3042880+00:00";

        JObject j1 = JObject.FromObject(new
        {
            time=s
        });

        Object o = j1["time"];

我们可以检查 o 是字符串并且等于“2012-08-08T01:54:45.3042880+00:00”

现在我们将 j1.ToString() 转移到另一个程序,即

       {
          "time": "2012-08-08T01:54:45.3042880+00:00"
       }

然后在另一个程序中,尝试将其解析回 JObject,即

       JObject j2 = JObject.Parse(j1.ToString());

       Object o2 = j2["time"];

现在,如果我们检查 o2,o2 的类型是 Date,o2.ToString() 是 8/7/2012 9:54:45 PM。

我的问题是:

有没有办法禁用 JObject.Parse 的日期反序列化,只获取原始字符串?

提前致谢

4

2 回答 2

87

从一个object到解析时,JObject您可以指定一个JsonSerializer指示如何处理日期的。

JObject.FromObject(new { time = s },
                   new JsonSerializer {
                          DateParseHandling = DateParseHandling.None
                   });

不幸Parse的是没有这个选项,尽管拥有它是有意义的。查看源代码Parse我们可以看到它所做的只是实例化 aJsonReader然后将其传递给Load. JsonReader确实有解析选项。

您可以像这样实现您想要的结果:

  using(JsonReader reader = new JsonTextReader(new StringReader(j1.ToString()))) {
    reader.DateParseHandling = DateParseHandling.None;
    JObject o = JObject.Load(reader);
  }
于 2012-08-08T02:25:34.320 回答
10

您也可以使用以下方法完成此JsonConvert.DeserializeObject操作JsonSerializerSettings

string s = "2012-08-08T01:54:45.3042880+00:00";
string jsonStr = $@"{{""time"":""{s}""}}";

JObject j1 = JsonConvert.DeserializeObject<JObject>(jsonStr, new JsonSerializerSettings {DateParseHandling = DateParseHandling.None});
于 2019-05-23T14:05:56.630 回答