2

私は実際には辞書であるプロパティを持っています。そして、私はTimeSpans、DateTimesなどの多くのタイプをこの辞書に保持しています。しかし、TimeSpansのシリアル化と逆シリアル化は間違っており、文字列として逆シリアル化されます。

var dict = new Dictionary<string, object>();
dict.Add("int", 15);
dict.Add("string", "foo");
dict.Add("timeSpan", new TimeSpan(1,1,1));
dict.Add("dateTime", DateTime.Now);

var settings = new JsonSerializerSettings{
    TypeNameHandling = TypeNameHandling.All,
        TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple
};
var serializedObj = JsonConvert.SerializeObject(dict, Newtonsoft.Json.Formatting.Indented, settings);
var deserializedObj = (Dictionary<string, object>)JsonConvert.DeserializeObject(serializedObj, settings);
//Displaying the types with LinqPad:
deserializedObj["int"].GetType().Dump();
deserializedObj["string"].GetType().Dump();
deserializedObj["timeSpan"].GetType().Dump();
deserializedObj["dateTime"].GetType().Dump();

結果: オブジェクトの種類

したがって、オブジェクト内のTimeSpanはタイムスパンに逆シリアル化できません。最新バージョンのJson.Netも試してみました。しかし、結果は同じです。

TimeSpanのタイプ名を指定するにはどうすればよいですか?または、カスタムコンバーターを作成する必要がありますか?

編集:

私はいくつかのテストを行い、シリアル化されたtimeSpanプロパティを次のように変更しました。

""timeSpan"": {
    ""$type"": ""System.TimeSpan"",
    ""$value"": ""01:01:01""}

今回はjson.netがTimeSpanとしてそれをdesrializeする可能性があります。しかし、このようにシリアル化レベルでTimeSpanの$typeと$valueを指定するにはどうすればよいですか?

4

3 に答える 3

5

私はついに解決策を見つけました。TimeSpan用のカスタムコンバーターを作成しました。しかし、Json.Netにはバグがあると思います。TimeSpanのようなプリミティブ型のコンバーターは作成しないからです。とにかくここに解決策があります:

public class TimeSpanConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(TimeSpan);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteStartObject();
        writer.WritePropertyName("$type");
        writer.WriteValue(value.GetType().FullName);
        writer.WritePropertyName("$value");
        writer.WriteValue(value);
        writer.WriteEndObject();
    }

    public override object ReadJson(JsonReader reader, Type type, object value, JsonSerializer serializer)
    {
        return value;
    }   
}

また、このコンバーターをjsonシリアライザー設定に追加することを忘れないでください。もしあれば、より良い解決策があれば幸いです。

于 2013-01-14T14:04:10.233 に答える
0

また、ディクショナリの値型としてSystem.Guidを使用すると、この問題が発生します。

このバグをJson.NET課題追跡システムに提出しました。

于 2013-01-25T08:22:33.563 に答える
0

私は少し掘り下げて根本的な問題を理解しました-それはJson.NETDefaultContractResolver.CanConvertToString()がtrueを返すすべてのタイプで発生します。ここを参照してください: Json.NET辞書のシリアル化における重大なバグ

残念ながら、現在、作者はバグではないと考えています。Json.NETは素晴らしいと思いますが、この問題は私を怖がらせます...

バグページでの議論は次のとおりです: https ://json.codeplex.com/workitem/23833

于 2013-04-08T17:59:38.873 に答える