反序列化每个响应中不同的JSON响应

时间:2017-06-09 07:46:30

标签: c# json json.net deserialization

我有复杂的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

但我悲惨地失败了。任何帮助将不胜感激

2 个答案:

答案 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();
    }
}

演示:https://dotnetfiddle.net/Q3S5hX

答案 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; }
}