Динамические элементы в json c# winforms

145
24 декабря 2019, 06:50

Для сериализации в json использую newtonsoft. Мне надо сделать один такой раздел так, чтобы при нажатии кнопки появлялись два новых textbox(сколько угодно раз) и эти данные записывались в один.

Вот в этом блоке isp может быть сколько угодно name и ipaddress(наши появляющиеся дополнительно по нажатию кнопки). Можно ли это сделать?

Answer 1

Насколько я понимаю, Вам нужно создать класс и сериализовать его экземпляр в JSON. Для приведённого JSON класс может выглядеть следующим образом:

public class Isp {
    public string Name { get; set; }
    public List<System.Net.IPAddress> IPAddresses { get; set; }
}
public class Config {
    public List<Isp> Isp { get; set; }
}

Далее просто сериализируете экземпляр класса Config в JSON и при необходимости создаёте экземпляр Config из JSON. Ниже приведены примеры сериализации и десериализации:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Text;
public static class NewtonsoftUtils {
    public static T Deserialize<T>(string path) => Deserialize<T>(path, Encoding.UTF8, 65536, true);
    public static T Deserialize<T>(string path, Encoding encoding, int bufferSize, bool detectEncodingFromBOM) {
        // Размер буфера 64К дает гораздо лучшую производительность, чем 
        // размер буфера по умолчанию 4K.Его можно увеличить еще больше, 
        // но было обнаружено, что дальнейшее увеличение буфера не дает 
        // существенного прироста в производительности, а на некоторых 
        // системах может привести и к ее снижению.
        int bs = bufferSize > 65536 || bufferSize < 0
            ? 65536
            : bufferSize;
        bool det = detectEncodingFromBOM;
        string content = string.Empty;
        using (var sr = new StreamReader(path, encoding, det, bs)) {
            content = sr.ReadToEnd();
        }
        return JsonConvert.DeserializeObject<T>(content);
    }
    public static void Serialize(object obj, string path) => Serialize(obj, path, Encoding.UTF8, 65536);
    public static void Serialize(object obj, string path, int bufferSize) => Serialize(obj, path, Encoding.UTF8, bufferSize);
    public static void Serialize(object obj, string path, Encoding encoding, int bufferSize) {
        Encoding enc = encoding ?? Encoding.UTF8;
        // Размер буфера 64К дает гораздо лучшую производительность, чем 
        // размер буфера по умолчанию 4K.Его можно увеличить еще больше, 
        // но было обнаружено, что дальнейшее увеличение буфера не дает 
        // существенного прироста в производительности, а на некоторых 
        // системах может привести и к ее снижению.
        int bs = bufferSize > 65536 || bufferSize < 0
            ? 65536
            : bufferSize;
        var serializer = new JsonSerializer {
            Formatting = Formatting.Indented
        };
        Directory.CreateDirectory(System.IO.Path.GetDirectoryName(path));
        using (var sw = new StreamWriter(path, false, enc, bs))
        using (var tw = new JsonTextWriter(sw)) {
            //TODO: NullValueHandling add to parameters
            // serializer.NullValueHandling = NullValueHandling.Ignore;
            serializer.Serialize(tw, obj);
        }
    }
}
// пример использования
NewtonsoftUtils.Serialize(configInstance, path);
Config config = NewtonsoftUtils.Deserialize<Config>(path);

Для решения Вашей задачи необходимо создать форму создания экземпляра Isp, где для Isp.Name Вы можете использовать TextBox, а для Isp.IPAddresses - ListBox. После создания экземпляра Isp добавляете его в Config.Isp и сериализируете в JSON.

READ ALSO
&ldquo;Упростить&rdquo; код до 1 строки

“Упростить” код до 1 строки

Есть ли способ решить следующую задачу в одну строку? или еще более компактно

142
Как использовать `FastSearchLibrary` библиотеку?

Как использовать `FastSearchLibrary` библиотеку?

Как вместо этого кода использовать FastSearchLibrary библиотеку? Просто этот код не ищет на диске С, даже если запускаю от имени администратора!...

161
Передача примитивного типа в делегат

Передача примитивного типа в делегат

Не первый раз встречаю подобный пример кода в сети:

142
Подключение к удаленной БД без MySql

Подключение к удаленной БД без MySql

В моем учебном заведении нет MySql, а лишь стандартные библиотекиКаким образом можно подключиться к удаленной БД на хосте, используя стандартные...

149