【问题标题】:Deserialize list of JSON objects反序列化 JSON 对象列表
【发布时间】:2014-11-26 23:22:47
【问题描述】:

我有一个 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。

返回单个值没有问题,只需返回此对象的列表。

任何指针都会有所帮助。

谢谢

【问题讨论】:

  • public D2[] d { get; set; }
  • 我应该提到,在像 C# 这样的强类型语言中,发送对象或对象列表都不好。如果您可以将其定义为始终是一个数组 - 有时只包含一个对象,您会更好。
  • @Alexander 也谢谢你。我使用了 [] 而不是 List。另外,感谢您的建议 :)

标签: c# json


【解决方案1】:

您正在尝试反序列化 List&lt;D2&gt; 而不是单个 D2 对象:

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

然后简单地说:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2016-05-30
    • 2012-03-07
    相关资源
    最近更新 更多