gpt4 book ai didi

c# - 反序列化 Microsoft.OData.Edm.Date

转载 作者:行者123 更新时间:2023-11-30 17:28:18 30 4
gpt4 key购买 nike

我正在使用 JsonConvert.DeserializeObject 反序列化一个对象,例程遇到了一个它不知道如何处理的日期字段。这是错误:

Error converting value \"2018-08-22\" to type 
'System.Nullable`1[Microsoft.OData.Edm.Date]'. Path 'value[3].actualclosedate'

Microsoft.OData.Edm.Date 是 Microsoft 用于保存仅日期数据的结构对象。

我正在尝试为此类字段构建自定义转换器,但无法正常工作。

这是我的转换器代码:

public class EdmDateConverter : DateTimeConverterBase
{
public override bool CanConvert(Type objectType) { return objectType == typeof(global::Microsoft.OData.Edm.Date); }

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return (global::Microsoft.OData.Edm.Date)global::Microsoft.OData.Edm.Date.Parse(reader.ReadAsString());
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
string myDate = ((global::Microsoft.OData.Edm.Date)value).Year.ToString("D4");
myDate += "-";
myDate += ((global::Microsoft.OData.Edm.Date)value).Month.ToString("D2");
myDate += "-";
myDate += ((global::Microsoft.OData.Edm.Date)value).Day.ToString("D2");

writer.WriteValue(myDate);
}
}

下面是我尝试将其链接到转换器的全局列表中的方式:

JsonConvert.DefaultSettings = () =>
{
var settings = new JsonSerializerSettings();
settings.Converters.Add(new EdmDateConverter());
//settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
return settings;
};

我遇到了和以前一样的错误,所以要么没有正确添加转换器,要么我没有正确编写它。

谁能给我一些关于这个问题的指导?

最佳答案

您的错误消息表明正在反序列化的成员类型是 Nullable<Microsoft.OData.Edm.Date> , 但你的 CanConvert 方法没有考虑 objectType 的可能性可能是 nullable .

您可以通过修改 CanConvert 来解决这个问题如下:

public class EdmDateConverter : DateTimeConverterBase
{
public override bool CanConvert(Type objectType)
{
var type = Nullable.GetUnderlyingType(objectType) ?? objectType;
return type == typeof(global::Microsoft.OData.Edm.Date);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.SkipComments().TokenType == JsonToken.Null)
return null;
return (global::Microsoft.OData.Edm.Date)global::Microsoft.OData.Edm.Date.Parse(reader.ReadAsString());
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
string myDate = ((global::Microsoft.OData.Edm.Date)value).Year.ToString("D4");
myDate += "-";
myDate += ((global::Microsoft.OData.Edm.Date)value).Month.ToString("D2");
myDate += "-";
myDate += ((global::Microsoft.OData.Edm.Date)value).Day.ToString("D2");

writer.WriteValue(myDate);
}
}

public static partial class JsonExtensions
{
public static JsonReader SkipComments(this JsonReader reader)
{
while (reader.TokenType == JsonToken.Comment && reader.Read())
;
return reader;
}
}

注意事项:

  • 检查 null 也是必要的ReadJson() 中的 token . WriteJson() , 另一方面,永远不会被要求 null值(value);相反,Json.NET 写入 null自动。

  • 您的代码可能存在其他问题,因为您的问题不包括示例 JSON、反序列化代码或 C# 类。

关于c# - 反序列化 Microsoft.OData.Edm.Date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53085008/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com