所以在我的应用程序中,我必须得到一个JSON字符串。 它可以是城市或城市名单。
在City课程中我有这个:
public class City
{
public string id { get; set; }
public string country { get; set; }
public string region { get; set; }
public string city { get; set; }
public string latitude { get; set; }
public string longitude { get; set; }
public string comment { get; set; }
public bool wasThereAnError { get; set; }
public class CityResponse
{
public string status { get; set; }
public string message { get; set; }
//public City result { get; set; }
public List<City> result { get; set; }
}
因此它使用List结果来存储数据。 当我得到一个JSON数组时,这很好用,它可以很容易地存储它们。 但是,如果我只查询1个城市,我会得到一个关于需要数组的例外。 这是我的电话代码:
async private Task<City.CityResponse> GetCityInformation(string url)
{
var client = new HttpClient();
var response = await client.GetAsync(new Uri(url));
string result = await response.Content.ReadAsStringAsync();
var cityRoot = JsonConvert.DeserializeObject<City.CityResponse>(result);
return cityRoot;
}
我是否可以在列表中存储1个城市?或者我需要建立一个单独的城市课程,或者我该如何解决这个问题?感谢
答案 0 :(得分:1)
而不是:
public class CityResponse
{
public string status { get; set; }
public string message { get; set; }
public List<City> result { get; set; }
}
尝试:
public class CityResponse
{
public string status { get; set; }
public string message { get; set; }
public string result {
get{ return null; }
set{
// if 1st character is "[" then it's an array of City, otherwise a City object
//depending on the above parse this string (which is like "{prop1: qqq, prop2: www}"
// or like "[{prop1: qqq, prop2: www}, {prop1: eee, prop2: eee}]")
// by the existing serializer or other one
// into City or array of cities
// if City, then convert in to array of cities
// and save result into realResult
}
}
public List<City> realResult { get; set; }
答案 1 :(得分:1)
根据Jim的回答,这是一个小解决方案。
class CityResponse
{
public string status { get; set; }
public object result
{
get { return null; }
set
{
cities = new List<City>();
if (value.GetType() == typeof(JArray))
{
cities = ((JArray)value).ToObject<List<City>>();
foreach(var city in cities) city.ParentResponse = this; // Edit
return;
}
if (value.GetType() != typeof(JObject))
return;
cities.Add(((JObject)value).ToObject<City>());
foreach(var city in cities) city.ParentResponse = this; // Edit
}
}
public string message { get; set; }
public List<City> cities { get; internal set; }
}
希望它有所帮助!
PS:我不知道提供JSON数据的系统是否由您创建,但是具有不一致类型的成员是糟糕的设计。
- 编辑 -
在回答有关此答案的评论时,询问如何从City对象访问CityResponse,以下是我将如何操作:
我会在City类中添加一个新属性,用于保存父CityResponse
public class City
{
public string id { get; set; }
...
public CityResponse ParentResponse { get; set;}
}
然后对setter进行一些小的更改,如上面答案的原始部分所示。