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

时间:2015-08-12 13:06:12

标签: json f# json.net record

为了(反)序列化的目的,我在F#中匹配JSON有效负载的记录集相对简单。当我尝试反序列化有效负载时,我收到错误

Unexpected property 'tags' found when reading union. Path 'products[0].tags'

我的记录和有效负载在结构上匹配,但在字段名称情况下不匹配;但是我在JSON.NET设置中添加了CamelCasePropertyNamesContractResolver来解决这个问题。

当我从示例有效负载和记录类型中删除tags属性时,错误会转移到提及变体。我还尝试在记录中添加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"
            ...
        },
        ...   
    ]
}

1 个答案:

答案 0 :(得分:3)

您的Vendor字段序列化输入是完整的。 option类型是一个有区别的联合,Json.NET期望所有DU被序列化为{"case":"blah","fields":["moreblah"]}。因此,在您的情况下,您应该使用"vendor":{"case":"Some","fields":["The Vendor"]}

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