我有复杂的JSON respone,它包含大约100个属性/对象/数组,并且在对象/数组方面有不同的响应。
首先,我有类似的结构(当对象存在时)
{
'att1': 'desc',
'att2': '83482',
'att3': null,
'test': {
'object_array1': [
100
],
'object_array2': [
'desc'
]
}
}
public class Root
{
//fields here
public Test test { get; set; }
}
public class Test
{
public List<int> object_array1 { get; set; }
public List<string> object_array2 { get; set; }
}
我遇到的问题是这个对象是空的。 之后,resposne正在改变并返回空数组。
所以它正在追问:
{
'att1': 'desc',
'att2': '83482',
'att3': null,
'test': [
]
}
因为我有标准错误:
附加信息:无法将当前JSON数组(例如[1,2,3])反序列化为“Test”类型,因为该类型需要JSON对象(例如{“name”:“value”})才能正确反序列化。
我试图用类似的东西编写customconverter:
private bool IsArray(string fieldName, JObject jObject)
{
return jObject[fieldName].Type == JTokenType.Array;
}
我正在使用JSON.NET
但我悲惨地失败了。任何帮助将不胜感激
答案 0 :(得分:1)
使用自定义转换器检查已在ReadJson
方法中读取的令牌类型,并在令牌为test
时替换JArray
的默认值(假设它只能当test
对象为“空”时为数组:
public class Root
{
[JsonConverter(typeof(TestIgnoreEmptyListConverter))]
public Test test { get; set; }
}
// .................
public class TestIgnoreEmptyListConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(Test).IsAssignableFrom(objectType) || objectType.IsArray;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var token = JToken.Load(reader);
if (token is JArray)
return default(Test);
else
return token.ToObject<Test>();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
答案 1 :(得分:0)
您的JSON属性名称与对象名称不匹配。 Serializer尝试使用属性名称或属性进行序列化/反序列化。
将其更改为正确的名称
public Test test { get; set; }
或使用属性为属性设置json名称。
[JsonProperty("test")]
public Test objects { get; set; }
甚至更好,重构您的代码以尊重C#约定。 (我建议将字段重命名为更具描述性)
public class Root
{
[JsonProperty("test")]
public Test Test { get; set; }
}
public class Test
{
[JsonProperty("object_array1")]
public List<int> IntArray { get; set; }
[JsonProperty("object_array2")]
public List<string> StringArray { get; set; }
}