0

所以在我的应用程序中,我必须得到一个 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 个城市吗?还是我需要开设一个单独的城市课程,或者我该怎么做?谢谢

4

2 回答 2

1

instead of:

public class CityResponse
    {
        public string status { get; set; }
        public string message { get; set; }
        public List<City> result { get; set; }
    }

try:

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; }
于 2013-11-14T02:31:05.733 回答
1

这是一个基于吉姆回答的小解决方案。

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;}
}

然后对设置器进行一些小的更改,如上面答案的原始部分所示。

于 2013-11-14T12:01:44.260 回答