簡體   English   中英

反序列化JSON對象列表

[英]Deserialize list of JSON objects

我有一個Windows Phone 8.1應用程序。

我正在嘗試解析Web API調用返回的對象列表。

在我的服務器上,我有以下代碼:

Default.aspx

[WebMethod]
public static List<Shared.PremisesResponse> GetPremises(string emailaddress)
{
    Premises premises = new Premises();
    return premises.GetPremises(emailaddress);
}

在那個前提下的對象類

    public List<Shared.PremisesResponse> GetPremises(string emailAlias)
    {
        DAL dal = new DAL();
        List<Shared.PremisesResponse> premises = new List<Shared.PremisesResponse>();

        try
        {
            DataSet dtMacs = dal.GetMacs(emailAlias);

            for (int index = 0; index < dtMacs.Tables[0].Rows.Count; index++)
            {
                Shared.PremisesResponse itemMAC1 = new Shared.PremisesResponse();
                itemMAC1.PremiseName = dtMacs.Tables[0].Rows[index]["PremiseName"].ToString().Trim();
                itemMAC1.Alias = dtMacs.Tables[0].Rows[index]["Alias"].ToString().Trim();
                premises.Add(itemMAC1);
            }
        }
        catch (Exception ex)
        {
            Email2.SendError("Premises.GetPremises:" + ex.ToString(), emailAlias);
            Shared.PremisesResponse itemMAC1 = new Shared.PremisesResponse();
            itemMAC1.PremiseName = "ERROR";
            itemMAC1.Alias = ex.ToString();
            premises.Add(itemMAC1);
        }
        return premises;
    }

Shared.Premise

    public class PremisesResponse
    {
        public string PremiseName;
        public string Alias;
    }

在我的WP8.1客戶端應用程序中:

    public async static Task<List<D2>> GetPremises( string emailaddress)
    {
        List<D2> premises = new List<D2>();
        try
        {
            using (var client = new HttpClient())
            {
                var resp = await client.PostAsJsonAsync("http://my url/NativeApp/Default.aspx/GetPremises",
                                                         new { emailaddress = emailaddress });

                var str = await resp.Content.ReadAsStringAsync();
                var premisesResponse = JsonConvert.DeserializeObject<List<D2>>(str);
                foreach (var pr in premisesResponse)
                {
                    D2 d2 = new D2();
                    d2.Alias = pr.Alias;
                    d2.PremiseName = pr.PremiseName;
                    premises.Add(d2);
                }
            }
        }
        catch (Exception ex)
        {
            //evMessage(Enums.MessageType.Error, serverRegister);
        }
        return premises;
    }

以及我在客戶端中使用的對象:

public class D2
{
    public string __type { get; set; }
    public string PremiseName;
    public string Alias;
}
public class PremisesResponse
{
    public D2 d { get; set; }
}

'var str'返回此值:

{"d":[{"__type":"InformedMotionBiz.Shared+PremisesResponse","PremiseName":"Informatica 2000","Alias":"9A5C3-E1945-3D315-BB43C"},{"__type":"InformedMotionBiz.Shared+PremisesResponse","PremiseName":"My Office","Alias":"40387-69918-FC22F-C444B"}]}

該行發生錯誤:

var premisesResponse = JsonConvert.DeserializeObject<List<PremisesResponse>>(str);

錯誤消息是:

[Informed.D2]',因為該類型需要JSON數組(例如[1,2,3])才能正確反序列化。 要解決此錯誤,可以將JSON更改為JSON數組(例如[1,2,3]),也可以更改反序列化類型,使其成為普通的.NET類型(例如,不像整數這樣的原始類型,也不像這樣的集合類型)數組或列表),可以從JSON對象反序列化。 還可以將JsonObjectAttribute添加到類型中,以強制其從JSON對象反序列化。
路徑“ d”,第1行,位置5。

我沒有問題返回單個值,只需返回此對象的列表即可。

任何指針都會有所幫助。

謝謝

您正在嘗試反序列化List<D2>而不是單個D2對象:

public class PremisesResponse
{
    public D2[] d { get; set; }
}

然后簡單地:

PremisesResponse response = JsonConvert.DeserializeObject<PremisesResponse>(str);

暫無
暫無

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

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