C#从JSON在线填充comboBox

时间:2015-07-31 13:21:17

标签: c# json winforms

我需要在线填充来自JSON的comboBox。它是一个WindowsForms项目,在C#中。 PHP页面返回以下字符串:

public class User
        {
            public int user_id { get; set; }
            public string first_name { get; set; }
            public string last_name { get; set; }
        }

        public class LegendsUsers
        {
            public int user_id { get; set; }
            public string first_name { get; set; }
            public string last_name { get; set; }
        }

        public class RootObject
        {
            public List<User> Users { get; set; }
            public List<LegendsUsers> LegendsUsers { get; set; }
        }

        public class ComboboxItem
        {
            public string Text { get; set; }
            public object Value { get; set; }

            public override string ToString()
            {
                return Text;
            }
        }

    String resposta = new
    WebClient().DownloadString("http://www.sample.com/readjson.php");
            var x = JsonConvert.DeserializeObject<RootObject>(resposta);
            foreach (var user in x.Users)
            {
               ComboboxItem item = new ComboboxItem();
               item.Text = user.first_name + " " + user.last_name;
               item.Value = user.user_id;
               comboBox1.Items.Add(item);
            }

user_id将是comboBox ID,first_name + last_name将是文本。我尝试了很多方法,但没有人工作得很好。有什么建议吗?

我的一次尝试:

{{1}}

错误:

Newtonsoft.Json.JsonSerializationException:无法将当前JSON数组(例如[1,2,3])反序列化为类型&#39; NB_WBF_Demo.NB_WBF_Demo + RootObject&#39;因为类型需要JSON对象(例如{&#34; name&#34;:&#34; value&#34;})才能正确反序列化。 要修复此错误,请将JSON更改为JSON对象(例如{&#34; name&#34;:&#34; value&#34;})或将反序列化类型更改为实现集合接口的数组或类型(例如ICollection,IList)就像可以从JSON数组反序列化的List。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。 路径&#39;&#39;,第1行,第1位。

2 个答案:

答案 0 :(得分:3)

由于你的json是一个数组/ List,而不是一个对象,你的反序列化代码应该是这样的

public class RootObject
{
    public string user_id { get; set; }
    public string first_name { get; set; }
    public string last_name { get; set; }
}
var x = JsonConvert.DeserializeObject<List<RootObject>>(resposta);
foreach (var user in x)
{
   .....
}

答案 1 :(得分:0)

您需要反序列化JSON Feed。完成此操作后,您可以设置ID和文本的属性,并设置ComboBox的数据源。

查看JSON.NET进行反序列化。这篇博文应该可以帮到你:

http://www.hanselman.com/blog/NuGetPackageOfTheWeek4DeserializingJSONWithJsonNET.aspx