Json.NET Disable the deserialization on DateTime

23,652

Solution 1

When parsing from an object to JObject you can specify a JsonSerializer which instructs how to handle dates.

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

Unfortunately Parse doesn't have this option, although it would make sense to have it. Looking at the source for Parse we can see that all it does is instantiate a JsonReader and then passes that to Load. JsonReader does have parsing options.

You can achieve your desired result like this:

  using(JsonReader reader = new JsonTextReader(new StringReader(j1.ToString()))) {
    reader.DateParseHandling = DateParseHandling.None;
    JObject o = JObject.Load(reader);
  }

Solution 2

You can accomplish this using JsonConvert.DeserializeObject as well, by using 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});
Share:
23,652
liuhongbo
Author by

liuhongbo

Updated on July 05, 2022

Comments

  • liuhongbo
    liuhongbo almost 2 years

    Here is the code:

            string s = "2012-08-08T01:54:45.3042880+00:00";
    
            JObject j1 = JObject.FromObject(new
            {
                time=s
            });
    
            Object o = j1["time"];
    

    We can check that o is string and equals "2012-08-08T01:54:45.3042880+00:00"

    Now we transfer j1.ToString() to another program, which is

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

    then at the other program, try to parse it back to JObject, which is

           JObject j2 = JObject.Parse(j1.ToString());
    
           Object o2 = j2["time"];
    

    Now, if we check o2, o2's type is Date, o2.ToString() is 8/7/2012 9:54:45 PM.

    My question is:

    Is there is way to disable the Date deserialization for JObject.Parse , and just get the raw string?

    Thanks in advance

  • liuhongbo
    liuhongbo almost 12 years
    the program receive the whole json string which is {"time": "2012-08-08T01:54:45.3042880+00:00"}, so the program can not use JObject.FromObject to parse, has to use JObject.Parse to parse the string and JOjbect.Parse only take 1 parameter.
  • JamesUsedHarden
    JamesUsedHarden almost 12 years
    @liuhongbo, weird that Parse doesn't provide the options that FromObject does. This peaked my curiosity so I downloaded the source and found a solution. I'll edit my answer.
  • liuhongbo
    liuhongbo almost 12 years
    thanks,Samuel Neff, that works perfect. Also, found another way to handle this issue: JsonSerializerSettings settings = new JsonSerializerSettings(); ; settings.DateParseHandling = DateParseHandling.None; JObject j2 = JsonConvert.DeserializeObject<JObject>(j1.ToString(), settings);
  • Dav
    Dav almost 12 years
    Thanks, this worked like a charm! Stopped me from implementing JsonReader.ToString and parsing the whole thing manually.
  • JamesUsedHarden
    JamesUsedHarden almost 12 years
    @Dav, glad it helped. This was a fun one to figure out.
  • Johnny Saxon
    Johnny Saxon over 4 years
    THANK YOU! I'd spent a few hours figuring out my own workaround, only to find that in one of our environments, JObject.Parse treats dates as day/month/year instead of month/day/year, which broke everything in a hurry. You're a lifesaver.
  • dbc
    dbc over 4 years
    And for, say, JArray, use JsonConvert.DeserializeObject<JArray>(jsonStr, new JsonSerializerSettings {DateParseHandling = DateParseHandling.None});
  • NinjaCross
    NinjaCross almost 3 years
    Perfect solution, thanks. Just a minor note: The readers are disposable, so the correct code should be: using var sr = new StringReader(j1.ToString()); using var reader = new JsonTextReader(sr); reader.DateParseHandling = DateParseHandling.None; var o = JObject.Load(reader);