繁体   English   中英

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

[英]Can't deserialize JSON into C# 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

但是我无法获得响应所得到的价值,一切都很好,但是请问如何将其放入对象并在需要的地方使用它。 例如,我想获取时间和另一个的值,但是我srclong srclat列表有srclong或者在子srclongsrclatsrclong获取位置,这是如何将Json转换为c#对象的项目: https:// /onedrive.live.com/?cid=e648f5a0f179f346&id=E648F5A0F179F346%218429&ithint=folder,rar&authkey=!ALKlJdwsb8ER2FA

在此处输入图片说明 这工作正常:

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

如果您不太担心丢失智能,则可以反序列化为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字符串开始进行检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM