Десериализовать json объект из комбинированного списка данных (загружен из базы данных) Winform - PullRequest
0 голосов
/ 15 февраля 2020

Доброе утро, мне трудно найти решение моей проблемы. У меня есть поле со списком, который заполняется с использованием источника данных из БД и тех данных, где 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 объект в моем комбинированном окне, а вместо десериализованных данных. Пример: я хочу показывать только имена в своем поле со списком, которое является значением под displayname в JSON Object.

enter image description here

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

Загрузите и установите пакет Newtonsoft.Json от NuGet. затем вы можете десериализовать вашу строку 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);

если вы хотите иметь отдельные DisplayMember и ValueMember, вы можете использовать свой массив JProperty в качестве источника данных.

например,

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

при использовании источника данных 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); 
   }
0 голосов
/ 15 февраля 2020

Создайте класс в качестве источника данных в поле со списком, например,

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,

Затем в свойстве combobox установите отображаемый элемент в качестве значения (это имя свойства, которое у вас есть в json, а также у вас в десериализованном классе, который является Displayname). точно напишите название свойства, которое вы хотите.

кстати, значение не является подходящим именем для отображаемого элемента, а указанная вами строка json, я считаю, неверна json. удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...