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

时间:2015-03-23 10:44:46

标签: c# json 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; }
}

deseralization示例:

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

我在这里完全遗漏了什么,或者我是编写自定义反序列化器和/或使用类似JSON.NET的唯一选择?

1 个答案:

答案 0 :(得分:1)

问题是你的JSON数组异常多态:它的第一个元素是一个对象,它的第二个元素是一个对象数组。表示这种情况的一种更自然的方式是作为具有两个命名属性的JSON对象 - 但这不是您给出的。由于JSON数据模型与您所需的数据模型完全不同,因此使用任何序列化程序将此直接反序列化为具有两个命名属性的c#POCO 将变得棘手。相反,将反序列化为中间表示并转换可能是最容易的。幸运的是,RestSharp有适当的中间类JsonObjectJsonArray

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

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