And*_*unt 4 f# json record json.net
我在 F# 中有一组相对简单的记录,与 JSON 有效负载匹配,用于(反)序列化。当我尝试反序列化有效负载时,出现错误
Unexpected property 'tags' found when reading union. Path 'products[0].tags'
Run Code Online (Sandbox Code Playgroud)
我的记录和有效负载在结构上匹配,但在字段名称大小写上不匹配;但我CamelCasePropertyNamesContractResolver在 JSON.NET 设置中添加了一个来解决这个问题。
当我从示例有效负载和记录类型中删除标签属性时,错误会继续提及变体。我还尝试向记录添加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
}
Run Code Online (Sandbox Code Playgroud)
JSON
{
"products": [
{
"id": 123,
"title": "A title",
"tags": "some, tags"
"variants": [],
"vendor": "The Vendor"
...
},
...
]
}
Run Code Online (Sandbox Code Playgroud)
您的Vendor字段序列化输入不正确。该option类型是可区分联合,Json.NET 期望所有 DU 都序列化为{"case":"blah","fields":["moreblah"]}. 所以在你的情况下你应该使用"vendor":{"case":"Some","fields":["The Vendor"]}.
我想象有人在某个地方编写了一个option特定的转换器,如果您无法更改序列化输入,您可以使用该转换器。
| 归档时间: |
|
| 查看次数: |
1924 次 |
| 最近记录: |