为了(反)序列化的目的,我在F#中匹配JSON有效负载的记录集相对简单。当我尝试反序列化有效负载时,我收到错误
Unexpected property 'tags' found when reading union. Path 'products[0].tags'
我的记录和有效负载在结构上匹配,但在字段名称情况下不匹配;但是我在JSON.NET设置中添加了CamelCasePropertyNamesContractResolver
来解决这个问题。
当我从示例有效负载和记录类型中删除tags属性时,错误会转移到提及变体。我还尝试在记录中添加CLIMutable
和DataContract
属性。在相关字段中添加JsonProperty
属性也无济于事。
查看JSON.NET源代码时,如果找不到具有该名称的联合案例,则会出现此错误。但是,在这种情况下,我正在处理记录中的字符串,所以这对我没有意义。
以前有人遇到过这个吗?这是图书馆的限制吗?或者我使用它错了吗?
进一步调查发现,这似乎是序列化记录中的string option
类型字段(现在添加到下面的代码中)的问题,该字段在有效负载中具有值。
F#
type Product = {
Id: int;
Title: int;
Tags: string;
Variants: Variant list;
Vendor: string option;
}
type ProductList = {
Products: Product list
}
JSON
{
"products": [
{
"id": 123,
"title": "A title",
"tags": "some, tags"
"variants": [],
"vendor": "The Vendor"
...
},
...
]
}
答案 0 :(得分:3)
您的Vendor
字段序列化输入是完整的。 option
类型是一个有区别的联合,Json.NET期望所有DU被序列化为{"case":"blah","fields":["moreblah"]}
。因此,在您的情况下,您应该使用"vendor":{"case":"Some","fields":["The Vendor"]}
。
如果您无法更改序列化输入,我可以想象有人在某处编写了一个option
特定的转换器。