无法将JSON反序列化为C#POCO

时间:2015-07-07 07:11:07

标签: c# asp.net json windows-8.1 poco

我无法将JSON对象转换为C#类对象我尝试了很多东西但是弹出了同样的错误:

  

无法反序列化当前的JSON对象(例如{“name”:“value”})   进入类型   'System.Collections.Generic.List`1 [CoderwallDotNet.Api.Models.Account]'   因为该类型需要一个JSON数组(例如[1,2,3])来反序列化   正确。

我正在使用此JSON并在Windows 8.1应用程序中获取响应。

[
{
    "id": 1,
    "time": 40,
    "srcLong": 35.909124,
    "srcLat": 31.973628,
    "destLong": 35.898258,
    "destLat": 31.985622,
    "subSites": [
        {
            "id": 1,
            "name": "location1"
        },
        {
            "id": 2,
            "name": "location2"
        },
        {
            "id": 3,
            "name": "locaion3"
        }
    ]
}]

并且我尝试使用webclient从JSON读取但是它无法正常工作它无法识别它所以我使用Newtonsoft.Json并且我创建了这些类以获得响应。

public class SubSite
{
    public int id { get; set; }
    public string name { get; set; }
}

public class RootObject
{
    public int id { get; set; }
    public int time { get; set; }
    public double srcLong { get; set; }
    public double srcLat { get; set; }
    public double destLong { get; set; }
    public double destLat { get; set; }
    public List<SubSite> subSites { get; set; }
}

var serviceUri = "http://localhost:24728/api/sites";     

var client = new HttpClient();            

var response = await client.GetAsync(serviceUri);            

var datafile = await response.Content.ReadAsStringAsyn();                        

List<RootObject> data = JsonConvert.DeserializeObject<List<RootObject>>(datafile); 

test1234.Text = data.ToString();//i am trying to for eample destlat

但是我无法获得我得到响应的价值,一切都很好但是如何将它放入对象并在任何我想要的地方使用它。例如,我想获得时间和其他的值,但我有子网站列表的问题或获取子网站内的位置或srclongsrclat这里是项目如何获得Json到c#对象: https://onedrive.live.com/?cid=e648f5a0f179f346&id=E648F5A0F179F346%218429&ithint=folder,rar&authkey=!ALKlJdwsb8ER2FA

2 个答案:

答案 0 :(得分:1)

enter image description here这很好用:

var data = JsonConvert.DeserializeObject<RootObject>(datafile) 

答案 1 :(得分:0)

如果您对丢失intellisense不太具体,可以反序列化为dynamic对象。使用动态的一个优点是,您不必创建类以便能够反序列化,并且如果返回的数据已更改,您也不需要更新类结构。举个例子,你可以这样做:

dynamic jsonValue = JsonConvert.DeserializeObject(jsonData);
foreach (dynamic rootObject in jsonValue)
{
   theData.destLong.Value <-- use it anyway you want, store in a variable, etc.
   // to get to each of the subSite in the rootObject
   foreach (dynamic subSite in rootObject.subSites)
   {
       subSite.id.Value <-- returns an int based on your data
       subSite.name.Value <-- returns a string based on your data
   }
}
// where jsonData constains the json string you posted

foreaeach很重要,因为您发布的数据将导致数组。您也可以只执行jsonValue[0],但要注意空值的错误,无论如何都应该从返回的json字符串开始检查。