使用 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 来解决这个问题。

当我从示例有效负载和记录类型中删除标签 属性 时,错误继续提及变体。我还尝试将 CLIMutableDataContract 属性添加到记录中。向相关字段添加 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 特定的转换器,如果你不能改变你的序列化输入,你可以使用。