我正在使用一个 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; }
}
当响应的变体字段中包含字典时,它可以很好地工作,但当它包含空数组时,它会失败。我收到来自 Newtonsoft 的错误,指出数组无法反序列化为字典。如果我将 Variations 属性定义为数组,则它适用于空数组,但当它是字典时则失败。我该怎么做才能正确反序列化两个可能的值,或者忽略空数组并将 Variations 设置为 null(当它是数组时而不是失败)。
Thanks.
这是使用 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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)