C#将JSON字符串添加到List

时间:2013-11-14 00:42:55

标签: c# json object serialization set

所以在我的应用程序中,我必须得到一个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个城市?或者我需要建立一个单独的城市课程,或者我该如何解决这个问题?感谢

2 个答案:

答案 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进行一些小的更改,如上面答案的原始部分所示。