簡體   English   中英

反序列化Json列出C#

[英]Deserialize Json to List C#

我在反序列化api返回的Json時遇到一些問題。

Json是以下內容:

{ "Result":[
    {
        "Id": 1, 
        "Type": "Type1"
    },
    {
        "Id": 2, 
        "Type": "Type2"
    }
]}

我正在嘗試將其反序列化為這種類型的列表:

public class ContactType
{
    public int Id { get; set; }
    public string Type { get; set; }
}

下面使用的ReturnType是:List <ContactType>,並以這種方式調用函數GetContactTypes:

var test = await _items.GetContactTypes<List<ContactType>>(AuthToken.access_token);

使用此代碼:

    public async Task<ReturnType> GetContactTypes<ReturnType>(string access_token)
    {
        try
        {
            Header = string.Format("Bearer {0}", access_token);
            client.DefaultRequestHeaders.Add("Authorization", Header);

            HttpResponseMessage response = await client.GetAsync(base_url + "contacttypes");

            if (response.StatusCode == HttpStatusCode.OK)
            {
                return JsonConvert.DeserializeObject<ReturnType>(await response.Content.ReadAsStringAsync());
            }
            else
            {
                return default(ReturnType);
            }
        }
        catch (Exception ex)
        {
            return default(ReturnType);
        }
    }

但是我總是會收到這個錯誤:

無法將當前JSON對象(例如{“ name”:“ value”})反序列化為類型'System.Collections.Generic.List`1',因為該類型需要JSON數組(例如[1,2,3])來反序列化正確地。

任何幫助表示贊賞,謝謝。

您要反序列化的對象具有單個屬性Result其中包含ContactType數組-您的對象模型中沒有該屬性。 嘗試反序列化此對象:

public class MyClass // give this a more meaningful name
{
    public List<ContactType> Result{ get; set; }
}

public class ContactType
{
    public int Id { get; set; }
    public string Type { get; set; }
}

接着:

...
var test = await _items.GetContactTypes<MyObject>(AuthToken.access_token);
...

您可能需要一個包裝器類,因為json對象不僅是數組本身,而且帶有帶有該數組值的節點"Result"

public class ContactResult
{
    public List<ContactType> Result {get; set;}
}

然后使用該包裝器類調用您的方法:

var test = await _items.GetContactTypes<ContactResult>(AuthToken.access_token);

如果您在json2csharp.com上為此JSON生成C#類,則會看到它創建了兩個類:ContactType和RootObject:

public class ContactType
{
    public int Id { get; set; }
    public string Type { get; set; }
}

public class RootObject
{
    public List<ContactType> Result { get; set; }
}

您的代碼失敗,因為當它實際上是帶有包含列表的RootObject類型時,它試圖反序列化JSON以鍵入List<ContactType>

因此,如果您首先反序列化RootObject類型, RootObject所示:

JsonConvert.DeserializeObject<RootObject>(str)

然后,您可以訪問反序列化RootObject對象內部的列表。

暫無
暫無

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

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