反序列化同一字段的字符串和字符串数组

时间:2020-01-24 19:19:35

标签: c# json

我有一个需要将json反序列化为对象的用例。 json如下

{
    "additionalAttributes": [
        {
            "name": "type",
            "value": "action"
        },
        {
            "name": "pages",
            "value": [                
                "34",
                "39",
                "43"
            ]
        },
        {
            "name": "chapters",
            "value": [                
                "The dawn of time",
                "The end of the world"
            ]
        }
   ]
}

困难的部分是 value 是字符串还是字符串数组。即使对象中只有一个字符串,生成的对象也应该具有字符串数组。

如何使用json.net做到这一点?反序列化器抱怨第一个值不是字符串数组。

我无法更改源json。

非常感谢 马尔滕

1 个答案:

答案 0 :(得分:0)

字符串和字符串数组均继承自object。这样您的模型可以像这样

public class AdditionalAttribute
{
    public string name { get; set; }
    public object value { get; set; }
}

然后,您必须将对象拆箱为两种类型之一。

另一种选择是使用隐式运算符将值定义为部分结构,如下所示

public partial class AdditionalAttribute
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("value")]
    public Value Value { get; set; }
}

public partial struct Value
{
    public string _value;
    public List<string> _valueArray;

    public static implicit operator Value(string value) => new Value { _value = value};
    public static implicit operator Value(List<string> valueArray) => new Value { _valueArray= valueArray};
}