web-dev-qa-db-ja.com

Json.NETはDateTimeの逆シリアル化を無効にします

これがコードです:

        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の日付の逆シリアル化を無効にし、そのままの文字列を取得する方法はありますか?

前もって感謝します

53
liuhongbo

objectからJObjectへの解析時には、日付の処理方法を指示するJsonSerializerを指定できます。

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

残念ながら、Parseにはこのオプションはありませんが、それを使用することは理にかなっています。 Parseのソースを見ると、JsonReaderをインスタンス化してLoadに渡すだけであることがわかります。 JsonReaderには解析オプションがあります。

次のようにして、希望する結果を得ることができます。

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

JsonSerializerSettingsを使用することにより、JsonConvert.DeserializeObjectを使用してこれを実行することもできます。

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