【发布时间】:2019-06-18 04:27:54
【问题描述】:
我遇到过 Newtonsoft 采用完全有效的 JSON 文本,但反序列化不正确的情况。我有一个对象,它包含一个由成员 Year、Month、Week 和 DayOfWk 组成的嵌入式类。 JSON 如下所示:
"openDate": {
"Year": 1997,
"Month": 12,
"Week": 5,
"DayOfWk": 5
},
但是反序列化后返回的数据是Year = 1,Month = 1,Week = 1,DayOfWk = 1,与输入的JSON无关。
这是代码(它在 F# 中,但应该易于阅读):
let jsonText = File.ReadAllText( @"..\..\..\..\Dependencies\ADBE.dat")
let dailyData = JsonConvert.DeserializeObject<DailyAnalysis[]>(jsonText)
DailyAnalysis 定义为:
type DailyAnalysis = {
openDate: TradeDate
openPrice: Decimal
closeDate: TradeDate
closePrice: Decimal
gainPercentage: Decimal
}
TradeDate 是有问题的类 - 它是一个公开属性 Year、Month、Week 和 DayOfWk 的 F# 类。年、月、周是整数; DayOfWeek 是 DayOfWeek 枚举。 DailyAnalysis 对象中的所有其他字段都返回正确的值。
如何解决这个问题?
请注意,如果我在 DeserializeObject 调用中不包含类型,它确实会获取正确的数据,但只是将其作为对象返回,并且转换为正确的类型非常困难(即,我不知道如何在 F# 中做到这一点)。
谁能指出我忽略的明显(甚至晦涩)的东西,或者指出其他资源?
更新:请注意,TradeDate 的构造函数采用单个 DateTime 参数。
【问题讨论】:
-
你能分享
TradeDate类型——即minimal reproducible example吗? -
不能用简单的例子复现,见dotnetfiddle.net/dxeHt9
-
我只能猜测
TradeDate构造函数的参数名称与属性名称不匹配。 Json.NET 使用参数名称将构造函数参数与属性匹配,因此如果名称不一致,则会传入默认值。请参阅dotnetfiddle.net/YSvyVy。但如果没有minimal reproducible example,我们只能猜测。 -
dbc - 我认为你的最后一点可能是答案 - 构造函数采用单个 DateTime 参数,当然,Json 无论如何都不知道那是什么。我将探索其他方式来构建它。谢谢。
-
现在没有时间检查,但这可能是一个急切的评估问题吗?将
letJsonText = ...更改为letJsonText () = ...