Json.NET禁用DateTime上的反序列化

liu*_*gbo 51 c# datetime json.net deserialization

这是代码:

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

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

        Object o = j1["time"];
Run Code Online (Sandbox Code Playgroud)

我们可以检查o是否为字符串并等于"2012-08-08T01:54:45.3042880 + 00:00"

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

       {
          "time": "2012-08-08T01:54:45.3042880+00:00"
       }
Run Code Online (Sandbox Code Playgroud)

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

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

       Object o2 = j2["time"];
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:

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

提前致谢

Sam*_*eff 73

从a解析时object,JObject您可以指定JsonSerializer指示如何处理日期的指令.

JObject.FromObject(new { time = s },
                   new JsonSerializer {
                          DateParseHandling = DateParseHandling.None
                   });
Run Code Online (Sandbox Code Playgroud)

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

你可以达到你想要的结果:

  JsonReader reader = new JsonTextReader(new StringReader(j1.ToString()));
  reader.DateParseHandling = DateParseHandling.None;
  JObject o = JObject.Load(reader);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,塞缪尔内夫,这完美无缺.另外,找到另一种方法来处理这个问题:JsonSerializerSettings settings = new JsonSerializerSettings(); ; settings.DateParseHandling = DateParseHandling.None; JObject j2 = JsonConvert.DeserializeObject <JObject>(j1.ToString(),settings); (8认同)

Bob*_*byA 7

您也可以使用以下方法完成此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});
Run Code Online (Sandbox Code Playgroud)

  • 对于“JArray”,请使用“JsonConvert.DeserializeObject&lt;JArray&gt;(jsonStr, new JsonSerializerSettings {DateParseHandling = DateParseHandling.None});” (2认同)