Aby serialize słownik z NodaTime.Instance do JSON przy użyciu Json.NET działa dobrze, ale po deserializacji rzuca Newtonsoft.Json. JsonSerializationException. poniżej Test pokazuje problem:Jak deserializować słownik z NodaTime.Instant przy użyciu Json.net bez uzyskiwania wyjątku?
[Test]
public void DeserializeDictionaryThowsException() {
JsonConverter[] converters = { NodaConverters.IntervalConverter, NodaConverters.InstantConverter };
var dictionary = new Dictionary<Instant, int>() {
{Instant.FromUtc(2012, 1, 2, 3, 4, 5), 0}
};
var json = JsonConvert.SerializeObject(dictionary, Formatting.None, converters);
Assert.AreEqual("{\"2012-01-02T03:04:05Z\":0}", json); //ok
var result = JsonConvert.DeserializeObject<Dictionary<Instant, int>>(json, converters); // throws
}
DeserializeObject rzuca:
Newtonsoft.Json.JsonSerializationException: nie można przekonwertować ciąg '2012-01-02T03: 04: 05Z' do słownika typ klucza „NodaTime .Natychmiastowy'. Utwórz TypeConverter, aby przekonwertować ciąg znaków na obiekt typu klucza. Wiersz 1, pozycja 24. ----> Newtonsoft.Json.JsonSerializationException: Błąd konwersji wartości "2012-01-02T03: 04: 05Z", aby wpisać "NodaTime.Instant". Linia 1, pozycja 24. ----> Wyjątek System.Exception: Nie można przesłać lub przekonwertować z System.String na NodaTime.Instant.
Na marginesie, deserializacja słownika DateTime działa poprawnie. Chyba dlatego, że String ma konwerter dla DateTime.
[Test]
public void DeserializeDiciotnaryOfDateTime() // OK
{
var expected = new DateTime(2012, 1, 2, 3, 4, 5, DateTimeKind.Utc);
var dictionary = new Dictionary<DateTime, int>() { { expected, 0 } };
var json = JsonConvert.SerializeObject(dictionary);
var result = JsonConvert.DeserializeObject<Dictionary<DateTime, int>>(json);
Assert.AreEqual(expected, dictionary.Keys.First()); // OK
}
Niestety nie widziałem tego wcześniej. Nie wiem wystarczająco dużo o Json.NET, aby dać ci odpowiedź od razu, ale czy możesz zgłosić błąd na http://noda-time.googlecode.com? –
Niestety, tęskniliśmy za tym wcześniej i dziękujemy za napisanie. Śledzimy ten problem [tutaj] (https://code.google.com/p/noda-time/issues/detail?id=237). –