使用 JSON.NET 序列化记录类型中的 F# 选项字段时出现意外 属性
Unexpected property when serializing F# option field in record type with JSON.NET
我在 F# 中有一组相对简单的记录,匹配 JSON 负载,用于(反)序列化。当我尝试反序列化负载时,出现错误
Unexpected property 'tags' found when reading union. Path 'products[0].tags'
我的记录和负载在结构上匹配,但在字段名大小写上不匹配;但我在 JSON.NET 设置中添加了 CamelCasePropertyNamesContractResolver
来解决这个问题。
当我从示例有效负载和记录类型中删除标签 属性 时,错误继续提及变体。我还尝试将 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"
...
},
...
]
}
您的 Vendor
字段序列化输入不正确。 option
类型是可区分的联合,Json.NET 期望所有 DU 都序列化为 {"case":"blah","fields":["moreblah"]}
。所以在你的情况下你应该使用 "vendor":{"case":"Some","fields":["The Vendor"]}
.
我想有人在某个地方写了一个 option
特定的转换器,如果你不能改变你的序列化输入,你可以使用。
我在 F# 中有一组相对简单的记录,匹配 JSON 负载,用于(反)序列化。当我尝试反序列化负载时,出现错误
Unexpected property 'tags' found when reading union. Path 'products[0].tags'
我的记录和负载在结构上匹配,但在字段名大小写上不匹配;但我在 JSON.NET 设置中添加了 CamelCasePropertyNamesContractResolver
来解决这个问题。
当我从示例有效负载和记录类型中删除标签 属性 时,错误继续提及变体。我还尝试将 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"
...
},
...
]
}
您的 Vendor
字段序列化输入不正确。 option
类型是可区分的联合,Json.NET 期望所有 DU 都序列化为 {"case":"blah","fields":["moreblah"]}
。所以在你的情况下你应该使用 "vendor":{"case":"Some","fields":["The Vendor"]}
.
我想有人在某个地方写了一个 option
特定的转换器,如果你不能改变你的序列化输入,你可以使用。