簡體   English   中英

使用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);

我是在這里完全丟失了某些東西,還是編寫自定義解串器和/或使用類似JSON.NET的唯一選擇?

問題在於您的JSON數組異常多態:其第一個元素是一個對象,而其第二個元素是一個對象數組。 表示此情況的更自然的方法是將其作為具有兩個命名屬性的JSON對象-但這不是您所得到的。 通過JSON數據模型與所需的數據模型完全不同,使用任何序列化程序在一個步驟中將其直接反序列化為具有兩個命名屬性的ac#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()
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM