从组合框数据反序列化json对象(从数据库加载)Winform

2020-02-15 c# json winforms combobox

早上好,我很难解决我的问题。我有一个组合框,它使用来自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下的值。

在此处输入图片说明

Answers

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

例如

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

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

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' : '[email protected]',
  'scope': 'contacts'},
  'verified': '0' } ,  'address':'blabla' ";
    var t = JsonConvert.DeserializeObject<MyData>(json);
combobox.datasource = t.displayname; // not sure about syntax of this line,

然后在combobox属性中将显示成员设置为value(这是您在json中拥有的属性的名称,在Deserialized类中也就是Displayname的属性)。准确地写下所需属性的名称。

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

Related