2014-02-15 19 views
1

我生成一個http請求,通過json獲得結果。如果結果是一切正常,但如果沒有結果,它會嘗試將值顯示到文本塊中時崩潰。我嘗試這一點,但它不工作如何檢查json數據是否存在?

HttpClient client = new HttpClient(); 
string url = "http://api.worldweatheronline.com/free/v1/search.ashx?q=" + Location + "&format=json&key=xxxx"; 
string DatenURL = await client.GetStringAsync(url); 
RootObject apiData = JsonConvert.DeserializeObject<RootObject>(DatenURL); 

if (apiData.search_api.result[0] != null) 
{ 
    txt_Result1.Text = apiData.search_api.result[0].areaName[0].value.ToString(); 
} 

這裏是JSON數據結構:

public class AreaName 
{ 
    public string value { get; set; } 
} 

public class Country 
{ 
    public string value { get; set; } 
} 

public class Region 
{ 
    public string value { get; set; } 
} 

public class WeatherUrl 
{ 
    public string value { get; set; } 
} 

public class Result 
{ 
    public List<AreaName> areaName { get; set; } 
    public List<Country> country { get; set; } 
    public string latitude { get; set; } 
    public string longitude { get; set; } 
    public string population { get; set; } 
    public List<Region> region { get; set; } 
    public List<WeatherUrl> weatherUrl { get; set; } 
} 

public class SearchApi 
{ 
    public List<Result> result { get; set; } 
} 

public class RootObject 
{ 
    public SearchApi search_api { get; set; } 
} 

回答

2

您檢查是否apiData.search_api.result [0]爲空,但需要先檢查在嘗試檢查嵌套元素之前查看整個apiData對象是否爲空。

if (apiData != null) 
    if (apiData.search_api.result[0] != null) 
    { 
     txt_Result1.Text = apiData.search_api.result[0].areaName[0].value.ToString(); 
    } 
1

總是檢查變量是否空第一訪問其特性之前,始終檢查是否List<T>具有任何元件第一使用索引訪問其元素之前。

在這種情況下,您需要檢查是否apiDataapiData.search_apiapiData.search_api.result是空的,如果apiData.search_api.resultapiData.search_api.result[0].areaName有任何元素。

試圖改變這種

if (apiData.search_api.result[0] != null) 
{ 
    txt_Result1.Text = apiData.search_api.result[0].areaName[0].value.ToString(); 
} 

這個

if (apiData != null && apiData.search_api != null 
    && apiData.search_api.result != null && apiData.search_api.result.Count > 0 
    && apiData.search_api.result[0].areaName.Count > 0) 
{ 
    txt_Result1.Text = apiData.search_api.result[0].areaName[0].value.ToString(); 
}