Json.NET Disable the deserialization on DateTime
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});
liuhongbo
Updated on July 05, 2022Comments
-
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 almost 12 yearsthe 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 almost 12 years@liuhongbo, weird that
Parse
doesn't provide the options thatFromObject
does. This peaked my curiosity so I downloaded the source and found a solution. I'll edit my answer. -
liuhongbo almost 12 yearsthanks,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 almost 12 yearsThanks, this worked like a charm! Stopped me from implementing JsonReader.ToString and parsing the whole thing manually.
-
JamesUsedHarden almost 12 years@Dav, glad it helped. This was a fun one to figure out.
-
Johnny Saxon over 4 yearsTHANK 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 over 4 yearsAnd for, say,
JArray
, useJsonConvert.DeserializeObject<JArray>(jsonStr, new JsonSerializerSettings {DateParseHandling = DateParseHandling.None});
-
NinjaCross almost 3 yearsPerfect 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);