我正在使用一个 API,它返回一个我需要反序列化的 json 对象。我的问题是这些对象的成员之一有时是空数组(“[]”),有时是字典(“{“1”:{...},“2”:{...}}“)。我想将它反序列化为数组或字典,因为我不关心 ID,我只想要所有对象的列表。这是我反序列化对象的方法:

var response = JsonConvert.DeserializeObject<Response>(json);

这是 Response 类的定义:
public class Response
{
    [JsonProperty(PropertyName = "variations")]
    public Dictionary<int, Variation> Variations { get; set; }
}

当 Response 在它的变体字段中包含一个字典时它运行良好,但当它包含一个空数组时它会失败。我收到来自 Newtonsoft 的错误消息,说无法将数组反序列化为字典。如果我将 Variations 属性定义为数组,则它适用于空数组,但当它是字典时会失败。我该怎么做才能正确反序列化两个可能的值,或者忽略空数组并将 Variations 设置为 null 当它是一个数组而不是失败时。

谢谢。

最佳答案

这是使用 JsonConverter 的替代解决方案

public class Response
{
    [JsonProperty(PropertyName = "variations")]
    [JsonConverter(typeof(EmptyArrayOrDictionaryConverter))]
    public Dictionary<int, Variation> Variations { get; set; }
}


public class EmptyArrayOrDictionaryConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType.IsAssignableFrom(typeof(Dictionary<string, object>));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        if (token.Type == JTokenType.Object)
        {
            return token.ToObject(objectType, serializer);
        }
        else if (token.Type == JTokenType.Array)
        {
            if (!token.HasValues)
            {
                // create empty dictionary
                return Activator.CreateInstance(objectType);
            }
        }

        throw new JsonSerializationException("Object or empty array expected");
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}

关于c# - 如何使用 Newtonsoft 反序列化可以是数组或字典的对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12221950/

10-12 13:10