使用 RestSharp 反序列化嵌套 JSON 数组

Deserializing nested JSON arrays using RestSharp

我正在尝试使用 RestSharp 反序列化以下 JSON 响应。我尝试了各种模型结构来提取数据无济于事。我一直被嵌套数组绊倒。

我无法控制该服务,因此无法更改格式。

JSON格式:

[
    {
        "results": 19,
        "statuscode": 200,
    },
    [
        {
            "id": 24,
            "name": "bob"
        },
        {
            "id": 82,
            "name": "alice"
        }
    ]
]

使用这个模型,我已经能够从第一个对象中提取数据,但仅此而已。我不确定如何准确读取对象后面的数组。

public class Info
{
    public int results { get; set; }
    public int statuscode { get; set; }
}

反序列化示例:

var deserializer = new JsonDeserializer();
var wat = deserializer.Deserialize<List<List<Info>>>(response);

我是不是完全遗漏了一些东西,或者我唯一的选择是编写自定义反序列化器 and/or 使用类似 JSON.NET 的东西?

问题是您的 JSON 数组异常多态:它的第一个元素是一个对象,第二个元素是一个对象数组。一种更自然的表示方式是将其表示为具有两个命名属性的 JSON 对象——但这并不是您所获得的。将其直接反序列化为具有两个命名属性的 c# POCO 在单个步骤中 使用任何序列化程序将很棘手,因为 JSON 数据模型与您所需的数据模型完全不同.相反,反序列化为中间表示并进行转换可能是最容易的。幸运的是 RestSharp 有适当的中间 类 JsonObject and JsonArray

因此,如果您想反序列化为以下 类:

public class Info
{
    public int results { get; set; }
    public int statuscode { get; set; }
}

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

public class ResponseContent
{
    public Info Info { get; set; }
    public List<IdAndName> Data { get; set; }
}

你可以这样做:

        var array = (JsonArray)SimpleJson.DeserializeObject(response.Content);
        var responseContent = (array == null ? (ResponseContent)null : new ResponseContent()
        {
            Info = array.OfType<JsonObject>().Select(o => SimpleJson.DeserializeObject<Info>(o.ToString())).FirstOrDefault(),
            Data = array.OfType<JsonArray>().SelectMany(a => SimpleJson.DeserializeObject<List<IdAndName>>(a.ToString())).ToList()
        });