Я отразил код класса JSON.NET JavaScriptDateTimeConverter, скопировал его и переименовал класс AS3DateTimeConverter, чтобы изменить его для форматирования объектов DateTime в более точной и строго типизированной усадьбе.Исключение JSON.NET при десериализации значения DateTime
она у меня выходной тип в соответствии с тем, как JSON.NET выходы строго типизированных объектов, таких как так: {"$type":"System.DateTime, mscorlib","ticks":0}
Переопределенный метод WriteJson из JsonConverter работает, чтобы произвести это значение.
Однако, когда я пытаюсь десериализации строки, используя те же параметры с тем же конвертером переопределен метод ReadJson никогда не получает шанс запустить и построить DateTime от тиков собственности, поскольку происходят следующие ошибки:
не может десериализации текущего объекта JSON (например, { «имя»: «значение»}) в тип «System.DateTime», так как тип требует примитивного значения JSON (например, строка, число, логическое значение, нуль) для десериализуем правильно.
Чтобы исправить эту ошибку, либо изменить JSON в примитивное значение JSON (например, строка, число, логическое значение, нуль) или изменить тип десериализованное так, что это нормальный тип .NET (например, не примитивный тип, как целое, а не тип коллекции, такой как массив или список), который может быть десериализован из объекта JSON. JsonObjectAttribute также можно добавить к типу, чтобы заставить его десериализовать объект JSON.
Путь «клещи», строка 1, позиция 45.
Является ли это какое-то ошибка или ограничений, которые не позволяют мне оживить тип DateTime, потому что этим значение типа? Или я чего-то не хватает?
Вот настройки сериализации:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
settings.PreserveReferencesHandling = PreserveReferencesHandling.All;
settings.ObjectCreationHandling = ObjectCreationHandling.Replace;
settings.ConstructorHandling = ConstructorHandling.Default;
settings.TypeNameHandling = TypeNameHandling.All;
settings.TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
settings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
settings.DateParseHandling = DateParseHandling.DateTime;
settings.Converters.Add(new AS3DateTimeConverter());
//settings.Binder = new AS3SerializationBinder();
string s = JsonConvert.SerializeObject(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), settings);
object o = JsonConvert.DeserializeObject(s, settings); //s = "{\"$type\":\"System.DateTime, mscorlib\",\"ticks\":0}" //ERROR OCCURS HERE
На самом деле это не будет хранить тики, он будет хранить миллисекунды, прошедшие с 1 января 1970 года, возможно, наряду с тиками для лучшей точности округления, но дело в том, что переопределенный метод ReadJson от JsonConverter никогда не дает возможности run, предположительно потому, что DateTime - это тип значения вместо класса? – Triynko
Можете ли вы показать код конвертера? –
Я мог бы, но ничего не стоило бы. Он просто расширяет встроенный JsonConverter и переопределяет методы WriteJson и ReadJson. Метод WriteJson работает нормально и создает строку JSON, которую я отобразил. Проблема в том, что несмотря на строку, включающую '' $ type ":« System.DateTime », метод CanConvert преобразователя никогда не вызывается с этим типом, и метод ReadJson преобразователя никогда не вызывается. Это похоже на то, что он даже не пытается использовать мой конвертер или даже тестирование, чтобы проверить, можно ли его использовать. Возможно, это серьезная проблема, но я думал, что это было автоматически. – Triynko