我不能像我想的那样反序列化JSON对象

时间:2017-07-13 21:04:56

标签: c# json

我有这样的网络回复:

[{
  "st1": [
    "folio1",
    "folio2"
  ],
  "st2": [
    "folio1"
  ]
}]

这是我调用我的网络服务器的代码:

var response = await client.GetAsync(uri+"server/getSTFolios/");
if (response.IsSuccessStatusCode)
{
 var content = await response.Content.ReadAsStringAsync();
 var Item = JsonConvert.DeserializeObject<List<ST>>(content);
 return Item;
}

这是ST类,用于反序列化我的响应

public class ST
    {
        private string v;

        public ST(string v)
        {
            this.v = v;
        }

        public string st { get; set; }
        public string location { get; set; }
        public string note { get; set; }
        public int pk { get; set; }
        public List<Folio> folios { get; set; } 
        public override string ToString()
        {
           return "ST: " + st;
        }
    }

但是我无法获得我的对象,我无法反序列化。 我在尝试打印Item.ToString()

时得到了这个
System.Collections.Generic.List`1[test2.ST]

这是我的调试器。 _com_error 感谢

1 个答案:

答案 0 :(得分:3)

我猜这是因为你试图用

反序列化你的JSON对象
var Item = JsonConvert.DeserializeObject<List<ST>>(content);

但是您收到的回复与ST的版本格式不同。

您正在尝试转换看起来像

的对象
{
    "st1": ["folio1","folio2"],
    "st2": ["folio1"]
}

到这个

public class ST
{
    public string st { get; set; }
    public string location { get; set; }
    public string note { get; set; }
    public int pk { get; set; }
    public List<Folio> folios { get; set; } 
}

他们根本不分享任何财产或任何东西。这就是为什么在调试和悬停在Item上时,您确实在该列表中看到了一个对象,但所有值都为空。 JsonConvert.DeserializeObject尝试将您的回复转换为ST格式,但未找到匹配的属性,只是创建了一个空的ST

如果您收到包含多个对象的回复,例如

[{
    "st1": ["folio1","folio2"],
    "st2": ["folio1"]
},
{
    "st1": ["folio1","folio2"],
    "st2": ["folio1"]
}]

当鼠标悬停在Item上时,您将拥有2个满足空值的对象。

修改

您需要让服务器使用看起来像ST类的对象进行响应。例如,如果您的响应看起来像这样,我认为它会起作用:

[{
    "st": "some string",
    "location": "some string",
    "note": "some string",
    "pk": 123,
    "folios" : 
    [{ 
        "pk": 123,
        "number": "some string" 
     },
     { 
        "pk": 123,
        "number": "some string" 
     }]
}]