当前位置: 首页 > 知识库问答 >
问题:

使用JSON.NET和NodaTime从JSON反序列化LocalTime会导致NodaTime.text.UnparsableValueException

丰辰沛
2023-03-14

我有一个问题,将时间值反序列化为本地时间-授予,我对Nodatime很陌生。我想导入一个web服务结果,它以“hh:mm”格式列出了一个时间。除非使用“hh:mm:ss.fff”格式的时间,否则会出现异常。是否有一种方法可以指定一个不同的模式并让“hh:mm”工作?

请看此代码

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.)
             */
        }
    }
}

引发异常:

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: 

共有1个答案

慕承允
2023-03-14

您需要删除它在调用ConfigureForNodatime时添加的默认转换器。这些转换器使用默认格式,并且不可配置(据我所知)。

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];
 类似资料:
  • 问题内容: 我有一个C#列表,看起来像这样: 我使用以下代码将JSON转换/序列化为(Newtonsoft.JSON): 使用上面的代码,我得到一个像这样的json字符串: 但是,这就是我需要得到的:由于我正在使用把手模板- 如何使用序列化器如上所述命名JSON数组? 问题答案: 用:

  • 问题内容: 我的JSON有点弱,所以我需要一些帮助。 我正在尝试反序列化用户的JSON: 放入我用属性装饰的对象中: 我得到以下异常: Newtonsoft.Json.JsonSerializationException:在JSON中找不到必需的属性’user_id’。 这是因为JSON对象是一个数组吗?如果是这样,如何将其反序列化为一个User对象? 提前致谢! 问题答案: 正如Alexandr

  • 问题内容: 我正在尝试使用自定义将一些JSON反序列化为各种子类 我几乎遵循了这一点。 我的抽象基类: 而我的派生: 只是一个包含一些字符串常量的静态类。 JSON文件反序列化如下: 现在,我的问题是,每当我运行代码时,都会出现以下错误: 有问题的Json文件如下所示: 在我看来,反序列化嵌套对象有麻烦,我该如何解决? 问题答案: 首先,错过了您的json中的菜单项“ Submenus Test”

  • 问题内容: 我正在尝试将一些JSON数据反序列化为应用程序的对象。到现在为止还不错,因为JSON数据上的属性是静态的(带有值的键)。现在,我得到了一个结果,其中的关键是动态数据。 这是一个示例JSON网址: http://en.wikipedia.org/w/api.php?action=query&format=json&pageids=6695&prop=info 由此产生的JSON是: 好的

  • 问题内容: 我是C ++的新手。使用序列化和反序列化类型数据的最简单方法是什么。我发现了一些使用示例,但它们对我来说是晦涩的。 问题答案: 请注意,将键解释为路径,例如,将对“ ab” =“ z”放置将创建{“ a”:{“ b”:“ z”}} JSON,而不是{“ ab”:“ z”} 。否则,使用是微不足道的。这是一个小例子。

  • 问题内容: 我正在尝试对a进行序列化/反序列化,如果对象是简单类型,这似乎很好,但是当对象更复杂时,它不起作用。 我有这个课: 在我的字典中,我添加了一个带有“重定向链”键的键和一些带有“状态”,“网址”,“父网址”键的简单字符串。我从JSON.Net返回的字符串如下所示: 我用来序列化的代码如下: 反序列化我正在做的事情: 字典恢复正常,所有字符串恢复正常,但是列表未正确反序列化。它只是作为 当