web-dev-qa-db-fra.com

Json.NET Désactiver la désérialisation sur DateTime

Voici le code:

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

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

        Object o = j1["time"];

Nous pouvons vérifier que o est une chaîne et est égal à "2012-08-08T01: 54: 45.3042880 + 00: 00"

Maintenant, nous transférons j1.ToString () vers un autre programme, qui est

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

puis à l'autre programme, essayez de le réanalyser vers JObject, qui est

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

       Object o2 = j2["time"];

Maintenant, si nous vérifions o2, le type de o2 est Date, o2.ToString () est 8/7/2012 9:54:45 PM.

Ma question est:

Existe-t-il un moyen de désactiver la désérialisation de la date pour JObject.Parse et d'obtenir simplement la chaîne brute?

Merci d'avance

53
liuhongbo

Lors de l'analyse d'un object vers JObject, vous pouvez spécifier un JsonSerializer qui indique comment gérer les dates.

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

Malheureusement, Parse n'a pas cette option, bien qu'il serait logique de l'avoir. En regardant la source de Parse, nous pouvons voir que tout ce qu'il fait est instancier un JsonReader puis le transmettre à Load. JsonReader a des options d'analyse.

Vous pouvez obtenir le résultat souhaité comme ceci:

  JsonReader reader = new JsonTextReader(new StringReader(j1.ToString()));
  reader.DateParseHandling = DateParseHandling.None;
  JObject o = JObject.Load(reader);
69
Samuel Neff

Vous pouvez accomplir cela en utilisant JsonConvert.DeserializeObject également, en utilisant 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});
1
BobbyA