【问题标题】:Deserialize json object from a combobox data (loaded from database) Winform从组合框数据(从数据库加载)反序列化 json 对象 Winform
【发布时间】:2020-02-15 03:21:10
【问题描述】:

早上好,我很难找到解决问题的方法。我有一个组合框,它使用来自 DB 的数据源和 JSON 对象所在的数据填充。我将如何反序列化这些数据? 这是来自数据库的 JSON 数据:

{"displayname":{"value":"Test","scope":"contacts","verified":"0"},"address":{"value":"","scope":"private","verified":"0"},"website":{"value":"","scope":"private","verified":"0"},"email":{"value":"","scope":"contacts","verified":"0"},"avatar":{"scope":"contacts","verified":"0"},"phone":{"value":"01234567890","scope":"private","verified":"0"},"twitter":{"value":"","scope":"private","verified":"0"}}

下面是组合框中将显示的内容。我不想要组合框中的 JSON 对象,而是反序列化数据。例如:我只想在我的组合框中显示名称,这是 JSON 对象中 displayname 下的值。

【问题讨论】:

  • 你应该创建一个代表 json 结构的类。将所有 json 字符串放入一个字符串集合中。反序列化字符串并为它们中的每一个创建一个类对象,并创建一个类对象的集合并通过设置 ComboBox 的 DisplayMember 属性将该集合绑定到 ComboBox
  • 您可以将数据反序列化为JObject 并映射到 ComboBox 的对象或创建相应的类型/类并将给定的数据反序列化为这些类型。

标签: c# json winforms combobox


【解决方案1】:

从 NuGet 下载并安装 Newtonsoft.Json 包。然后您可以反序列化您的 JSON 字符串并将其添加到您的 Combobox 项目中。

例如

//using Newtonsoft.Json;
//using Newtonsoft.Json.Linq;

    string jsonStr = "Your JsonString ... ";
    var parsed = JsonConvert.DeserializeObject<JObject>(jsonStr);
    string[] lst = parsed.Properties().Select(q => q.Name).ToArray();
    comboBox1.Items.AddRange(lst);


如果您想拥有单独的DisplayMemberValueMember,您可以使用您的JProperty 数组作为数据源。

例如

    string jsonStr = "Your JsonString ... ";
    var parsed = JsonConvert.DeserializeObject<JObject>(jsonStr);
    comboBox1.DataSource = parsed.Properties().ToArray();
    comboBox1.DisplayMember = "Name";
    comboBox1.ValueMember = "Value";

当您使用 DataSource 时,comboBox1.SelectedItem 也是一个 JProperty。所以你可以使用这个对象来访问你的 json 字符串中的其他数据。

例如

   private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
   {
      // selectedValue is equal to `value` in the json string
      var selectedValue = ((JProperty)comboBox1.SelectedItem).Value.Value<string>("value");
      MessageBox.Show(selectedValue); 
   }

【讨论】:

  • 谢谢@AliReza。会试试这个,稍后会更新你,。
  • 我会给这个+1,因为它很有用,但实际上并不能解决我的问题,或者我可能只是不知道获取所需数据所需的额外代码。谢谢
  • 谢谢。你到底需要什么?我只是在这些示例中使用了your sample JSON string。也许您的数据结构不同。您可以调整此答案以获得您想要的结果......或询问您是否有任何问题。 @詹姆斯
  • 我已经找到了使用这个的解决方案。 RootObject 测试 = JsonConvert.DeserializeObject(jsonstr);使用此类 public class Displayname { public string value { get;放; } } 公共类 RootObject { 公共显示名称显示名称 { 获取;放; } }
【解决方案2】:

像这样创建一个类作为您的组合框数据源,

public class Displayname
{
    public string scope;
    public string value; // as your display member in combobox
    public int verified;
}
public class MyData
{
    public string address;
    public Displayname displayname;
}

然后将您的 JSON 反序列化为这样的 MyData 对象

string json = @"{
                'displayname': {'value' : 'james@example.com',
  'scope': 'contacts'},
  'verified': '0' } ,  'address':'blabla' ";
    var t = JsonConvert.DeserializeObject<MyData>(json);
combobox.datasource = t.displayname; // not sure about syntax of this line,

然后在组合框属性中将显示成员设置为值(这是您在 json 中拥有的属性的名称,也是您在 Deserialized 类中的显示名称)。准确地写下您想要的属性的名称。

顺便说一句,值不是显示成员的好名字,我认为您提供的 json 字符串不是正确的 json。祝你好运

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    相关资源
    最近更新 更多