3

次のクラスを適切にシリアル化するために、.NET 4.5 の WebAPI にバンドルされているNewtonsoft JSON Libraryを取得しようとしています。

public class SomeClass {
    [Required]
    public DateTime DateToBeSerialized { get; set; }

    [Required]
    public Dictionary<DateTime, long> DatesDict { get; set; }
}

シリアル化後、次の JSON が出力されます。

"DateToBeSerialized": "2013-03-07T19:03:22.5432182Z",
"DatesDict": {
    "12/01/2012 00:00:00": 593,
    "01/01/2013 00:00:00": 691,
    "02/01/2013 00:00:00": 174,
    "03/01/2013 00:00:00": 467
}

ご覧のとおり、シリアライザーは、オブジェクトのタイプが の場合はmyの形式を尊重しますが、 a のキー部分をシリアル化する場合はそうしません。DateTime DateTimeKeyValuePair<DateTime, long>

つまり、シリアライザーに次のように出力してもらいたいのです。

"DateToBeSerialized": "2013-03-07T19:03:22.5432182Z",
"DatesDict": {
    "2012-12-01T00:00:00.0000000Z": 593,
    "2013-01-01T00:00:00.0000000Z": 691,
    "2013-02-01T00:00:00.0000000Z": 174,
    "2013-03-01T00:00:00.0000000Z": 467
}

この問題を解決する方法についてコミュニティが提供できる提案があれば幸いです。

4

1 に答える 1

0

これは、JSON.Net 5.0 リリース 1 (2013 年 4 月 7 日) で修正されました。最新バージョンにアップデートすれば、準備万端です。

検証に使用したテストコードは次のとおりです。

SomeClass sc = new SomeClass();
sc.DateToBeSerialized = new DateTime(2013, 3, 7, 19, 3, 22, 543, DateTimeKind.Utc);
sc.DatesDict = new Dictionary<DateTime, long>();
sc.DatesDict.Add(new DateTime(2012, 12, 1, 0, 0, 0, 1, DateTimeKind.Utc), 593);
sc.DatesDict.Add(new DateTime(2013, 1, 1, 0, 0, 0, 2, DateTimeKind.Utc), 691);
sc.DatesDict.Add(new DateTime(2013, 2, 1, 0, 0, 0, 3, DateTimeKind.Utc), 174);
sc.DatesDict.Add(new DateTime(2013, 3, 1, 0, 0, 0, 4, DateTimeKind.Utc), 467);

string json = JsonConvert.SerializeObject(sc, Formatting.Indented);
Console.WriteLine(json);

出力:

{
  "DateToBeSerialized": "2013-03-07T19:03:22.543Z",
  "DatesDict": {
    "2012-12-01T00:00:00.001Z": 593,
    "2013-01-01T00:00:00.002Z": 691,
    "2013-02-01T00:00:00.003Z": 174,
    "2013-03-01T00:00:00.004Z": 467
  }
}
于 2014-01-13T05:06:15.720 に答える