c# json json.net deserialization nodatime

c# - Deserializar LocalTime desde JSON utilizando JSON.NET y NodaTime da como resultado NodaTime.Text.UnparsableValueException



deserialization (1)

Deberá eliminar los conversores predeterminados que agrega al llamar a ConfigureForNodaTime . Esos convertidores usan formatos predeterminados y no son configurables (hasta donde yo sé).

JsonSerializerSettings jss = new JsonSerializerSettings(); jss.ConfigureForNodaTime(DateTimeZoneProviders.Bcl); jss.Converters.Remove(NodaConverters.LocalTimeConverter); jss.Converters.Add(new NodaPatternConverter<LocalTime>(LocalTimePattern.CreateWithInvariantCulture("HH'':''mm"))); MyObject mo2 = JsonConvert.DeserializeObject<List<MyObject>>(serializedObject2, jss)[0];

Estoy teniendo un problema al deserializar los valores de tiempo en LocalTime, ya que soy bastante nuevo en NodaTime. Quiero importar un resultado del servicio web que enumera una hora en formato "HH: mm". Recibo una excepción a menos que use una hora en formato "hh: mm: ss.fff". ¿Hay alguna manera de especificar un patrón diferente y hacer que "HH: mm" funcione?

Por favor mira este código

using System; using System.Collections.Generic; using Newtonsoft.Json; using NodaTime; using NodaTime.Serialization.JsonNet; using NodaTime.Text; // Required for LocalTimePattern namespace TestNodaTime { class MyObject { [JsonProperty("var1")] public int MyProperty { get; set; } [JsonProperty("time")] public LocalTime MyTime { get; set; } } class Program { static void Main(string[] args) { string serializedObject1 = "[{/"var1/":/"42/",/"time/":/"01:02:03.004/"}]"; string serializedObject2 = "[{/"var1/":/"42/",/"time/":/"01:02/"}]"; JsonSerializerSettings jss = new JsonSerializerSettings(); jss.ConfigureForNodaTime(DateTimeZoneProviders.Bcl); // This works - the pattern is "hh:mm:ss.fff" MyObject mo1 = JsonConvert.DeserializeObject<List<MyObject>>(serializedObject1, jss)[0]; // This causes an exception - the pattern is "HH:mm" MyObject mo2 = JsonConvert.DeserializeObject<List<MyObject>>(serializedObject2, jss)[0]; /* * An unhandled exception of type ''NodaTime.Text.UnparsableValueException'' occurred in Newtonsoft.Json.dll * Additional information: The value string does not match a quoted string in the pattern. * Value being parsed: ''01:02^''. (^ indicates error position.) */ } } }

Excepción lanzada:

NodaTime.Text.UnparsableValueException was unhandled HResult=-2146233033 Message=The value string does not match a quoted string in the pattern. Value being parsed: ''01:02^''. (^ indicates error position.) Source=NodaTime StackTrace: at NodaTime.Text.ParseResult`1.GetValueOrThrow() at NodaTime.Text.ParseResult`1.get_Value() at NodaTime.Serialization.JsonNet.NodaPatternConverter`1.ReadJsonImpl(JsonReader reader, JsonSerializer serializer) at NodaTime.Serialization.JsonNet.NodaConverterBase`1.ReadJson(JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter converter, JsonReader reader, Type objectType, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType) at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings) at TestNodaTime.Program.Main(String[] args) at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException: