使用 JSON.NET 序列化记录类型中的 F# 选项字段时出现意外属性

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)

Dax*_*ohl 5

您的Vendor字段序列化输入不正确。该option类型是可区​​分联合,Json.NET 期望所有 DU 都序列化为{"case":"blah","fields":["moreblah"]}. 所以在你的情况下你应该使用"vendor":{"case":"Some","fields":["The Vendor"]}.

我想象有人在某个地方编写了一个option特定的转换器,如果您无法更改序列化输入,您可以使用该转换器。