Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化对象的JSON数组,但当数组包含1个对象时,将忽略该数组_C#_Json_Asp.net Core_.net Core_Deserialization - Fatal编程技术网

C# 反序列化对象的JSON数组,但当数组包含1个对象时,将忽略该数组

C# 反序列化对象的JSON数组,但当数组包含1个对象时,将忽略该数组,c#,json,asp.net-core,.net-core,deserialization,C#,Json,Asp.net Core,.net Core,Deserialization,我正在使用一个带有.NET内核的api,它返回对象数组。但是当数组只包含一个对象时,外部API将删除该数组,并直接粘贴该对象 我希望有一个属性或设置不需要我处理作业对象,或覆盖JsonConverter 示例JSON im正在处理: { "a": { "b": [{ "id": 1, "name": "first object" }, { "id": 2, "n

我正在使用一个带有.NET内核的api,它返回对象数组。但是当数组只包含一个对象时,外部API将删除该数组,并直接粘贴该对象

我希望有一个属性或设置不需要我处理作业对象,或覆盖JsonConverter

示例JSON im正在处理:

{
    "a": {
        "b": [{
            "id": 1,
            "name": "first object"
        }, {
            "id": 2,
            "name": "second object"
        }]
    }
}
省略数组的Json

{
    "a": {
        "b": {
            "id": 1,
            "name": "One object only"
        }
    }
}
这就是我正在做的(简化)

公共类响应
{
公共A{get;set;}
}
公共A类
{
公共列表b{get;set;}
}
公共B级
{
公共int id{get;set;}
公共字符串名称{get;set;}
}
var apiResponse=await response.Content.ReadAsAsync()
我希望在返回第二个JSON示例时,ReadAsAsync()能够自动理解应该将其转换为一个包含一个对象B的数组


问题是,这可能发生在API响应的许多地方。

您可以创建一个自定义JsonConverter来检查您是处理数组还是处理单个对象。以下示例显示了转换为
列表的转换器:

可能重复的
public class Response
{
    public A a { get; set; }
}

public class A
{
    public List<B> b { get; set; }
}

public class B
{
    public int id { get; set; }
    public string name { get; set; }
}

var apiResponse = await response.Content.ReadAsAsync<Response>()
public class ArrayJsonConverter<T> : JsonConverter<List<T>>
{
    public override List<T> ReadJson(JsonReader reader, Type objectType, List<T> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartObject)
        {
            var jObj = JObject.Load(reader);
            var obj = jObj.ToObject<T>();
            var lst = new List<T>();
            lst.Add(obj);
            return lst;
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            var jArray = JArray.Load(reader);
            return jArray.ToObject<IEnumerable<T>>().ToList();
        }
        throw new InvalidOperationException();
    }

    public override void WriteJson(JsonWriter writer, List<T> value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
public class A
{
    [JsonConverter(typeof(ArrayJsonConverter<B>))]
    public List<B> b { get; set; }
}