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

C# 反序列化每个响应中不同的JSON响应,c#,json,json.net,deserialization,C#,Json,Json.net,Deserialization,我有一个复杂的JSON响应,它包含大约100个属性/对象/数组,并且在对象/数组方面有不同的响应 首先,我有这样的结构(当对象存在时) 因此我有标准误差: 其他信息:无法将当前JSON数组(例如[1,2,3])反序列化为类型“Test”,因为该类型需要一个JSON对象(例如{“name”:“value”})才能正确反序列化 我试图用这样的东西编写customconverter: private bool IsArray(string fieldName, JObject jObject)

我有一个复杂的JSON响应,它包含大约100个属性/对象/数组,并且在对象/数组方面有不同的响应

首先,我有这样的结构(当对象存在时)

因此我有标准误差:

其他信息:无法将当前JSON数组(例如[1,2,3])反序列化为类型“Test”,因为该类型需要一个JSON对象(例如{“name”:“value”})才能正确反序列化

我试图用这样的东西编写customconverter:

    private bool IsArray(string fieldName, JObject jObject)
    {
        return jObject[fieldName].Type == JTokenType.Array;
    }
我正在使用JSON.NET


但我失败得很惨。任何帮助都将不胜感激

您的JSON属性名称与对象名称不匹配。序列化程序尝试使用属性名或属性序列化/反序列化

将此更改为正确的名称

public Test test { get; set; }
或者使用属性设置属性的json名称

[JsonProperty("test")]
public Test objects { get; set; }
或者更好的做法是,重构代码以遵守C#约定。(我建议将字段重命名为更具描述性)

公共类根目录
{
[JsonProperty(“测试”)]
公共测试测试{get;set;}
}
公开课考试
{
[JsonProperty(“对象数组1”)]
数组中的公共列表{get;set;}
[JsonProperty(“对象数组2”)]
公共列表字符串数组{get;set;}
}

使用自定义转换器,该转换器将检查已在
ReadJson
方法中读取的令牌类型,并在令牌类型为
JArray
时,将一些默认值替换为
test
(假设只有当
test
对象为“空”时,它才能是一个数组):

公共类根目录
{
[JsonConverter(typeof(testignoremptylistconverter))]
公共测试测试{get;set;}
}
// .................
公共类TestIgnoreEmptyListConverter:JsonConverter
{
公共覆盖布尔CanConvert(类型objectType)
{
返回typeof(Test).IsAssignableFrom(objectType)| | objectType.IsArray;
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
var token=JToken.Load(读卡器);
if(标记为JArray)
返回默认值(测试);
其他的
返回token.ToObject();
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
抛出新的NotImplementedException();
}
}

演示:

序列化或反序列化时您是否面临挑战?如标题和标签所示?“while desarilization:)编辑了我的文章,但这并不能解决问题。这只是重写的错误,很抱歉。谢谢!工作就像一个符咒:)
public Test test { get; set; }
[JsonProperty("test")]
public Test objects { get; set; }
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; }
}
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();
    }
}