Сериализация списка строк в JSON на С#

(здесь я переформулировал свой вопрос: Создание экземпляров класса на основе динамических списков элементов)

В настоящее время я работаю над программой в Visual Studio 2015 с С#.

У меня есть 5 строк списка, которые содержат данные, которые я хочу сериализовать в файл json.

public List<string> name { get; private set; }
public List<string> userImageURL { get; private set; }
public List<string> nickname { get; private set; }
public List<string> info { get; private set; }
public List<string> available { get; private set; }

Пример желаемого формата файла json:

{
    "users" : 
    [
        {
            "name" : "name1",
            "userImageURL" : "userImageURL1",
            "nickname" : "nickname1",
            "info" : "info1",
            "available" : false,
        },
        {
            "name" : "name2",
            "userImageURL" : "userImageURL2",
            "nickname" : "nickname2",
            "info" : "info2",
            "available" : false,
        },
        {
            "name" : "name3",
            "userImageURL" : "userImageURL3",
            "nickname" : "nickname3",
            "info" : "info3",
            "available" : false,
        },
        {
            "name" : "name4",
            "userImageURL" : "userImageURL4",
            "nickname" : "nickname4",
            "info" : "info4",
            "available" : false,
        }

    ]
} 

Обратите внимание, что в приведенном выше примере json могут быть ошибки.

Я попытался объединить 5 списков, чтобы создать 1 список, чтобы сериализовать его, используя следующий код:

users = new List<string>(name.Count + userImageURL.Count + nickname.Count + info.Count + available.Count);
            allPlayers.AddRange(name);
            allPlayers.AddRange(userImageURL);
            allPlayers.AddRange(nickname);
            allPlayers.AddRange(info);
            allPlayers.AddRange(available);

Затем я сериализую список следующим кодом:

string data = JsonConvert.SerializeObject(users);
            File.WriteAllText("data.json", data);

Это просто создает массив неорганизованных объектов. Я хочу знать, как я могу организовать их, как указано в формате выше.

PS: я довольно новичок в кодировании, как вы можете сказать. Извините, если я не правильно формулирую вопрос или использую правильную терминологию. Кроме того, это не оригинальный код. Код создает эти списки, которые я хочу сериализовать в файл json.

PSS: эти данные собираются с помощью HtmlAgilityPack. Вчера я задал вопрос, спрашивая, как я могу разобрать html-файл и сериализовать его данные в файл json. Использование HtmlAgilityPack для получения определенные данные в C# и сериализовать их в json . Поскольку никто не ответил, я решил попробовать сделать это сам. Метод, который я использовал, возможно, не самый лучший, но это то, что я мог бы сделать с теми знаниями, которые у меня есть.


person Jose Cancel    schedule 29.02.2016    source источник
comment
Ваши свойства в любом случае не создадут этот вывод. Вам нужно создать пользовательский класс и составить его список. Не список каждого свойства.   -  person Cubicle.Jockey    schedule 01.03.2016
comment
Не обязательно везде писать в кавычках. Это не обычный способ писать, вас будет легче понять, если вы будете писать более правильно.   -  person JK.    schedule 01.03.2016
comment
Я немного впечатлен тем, что мой вопрос получил так много голосов. Я попытался упростить свой вопрос, потому что я не был уверен, что люди, которых мы не отвечаем на другие мои вопросы, потому что они слишком длинные.   -  person Jose Cancel    schedule 01.03.2016
comment
Не уверен, что кто-нибудь из вас может мне помочь, но я переформулировал свой вопрос здесь: stackoverflow.com/questions/35782580/   -  person Jose Cancel    schedule 04.03.2016


Ответы (2)


Я бы посоветовал начать с рефакторинга вашего кода вместо пяти "параллельные коллекции", иметь единственную коллекцию нового типа, User:

public class User
{
    public string Name { get; set; }
    public string ImageUrl { get; set; }
    public string NickName { get; set; }
    public string Info { get; set; }
    public bool Available { get; set; }
}

...

// In your containing type
public List<User> Users { get; set; }

Это, вероятно, упростит жизнь не только для вашего JSON, но и для остального кода, потому что у вас больше нет возможности иметь больше псевдонимов, чем URL-адресов изображений и т. д. В общем, наличие нескольких коллекций, которые должны храниться в синхронизация друг с другом является антипаттерном. Бывают моменты, когда это уместно — как правило, при предоставлении разных эффективных способов извлечения одних и тех же данных — но в таких случаях лучше избегать этого.

person Jon Skeet    schedule 29.02.2016
comment
@JoseCancel: ответ все тот же — вы должны реструктурировать свои данные как можно раньше. Вы можете сделать это, даже если начнете с пяти отдельных списков. - person Jon Skeet; 01.03.2016
comment
Эти данные собираются с помощью HtmlAgilityPack. Вчера я задал вопрос, спрашивая, как я могу разобрать html-файл и сериализовать его данные в файл json. stackoverflow.com/questions/35693367/ . Поскольку никто не ответил, я решил попробовать сделать это сам. Метод, который я использовал, возможно, не самый лучший, но это то, что я мог бы сделать с теми знаниями, которые у меня есть. - person Jose Cancel; 01.03.2016
comment
Мне удалось собрать нужные данные и теперь передо мной стоит задача сериализовать их в файл json. Если вы можете помочь мне с этим, пожалуйста, сделайте это. Если вы знаете лучший метод, пожалуйста, поделитесь им. - person Jose Cancel; 01.03.2016
comment
@JoseCancel: Что ж, если у вас есть корневой объект со свойством Users типа List<User> и вы используете JsonConvert.SerializeObject(root), тогда он должен работать. Используйте [JsonProperty] для настройки имен, используемых в JSON. - person Jon Skeet; 01.03.2016
comment
Спасибо, что дали мне знать. Я изучу информацию о [JsonProperty]. - person Jose Cancel; 01.03.2016
comment
Не уверен, что вы могли бы мне помочь сейчас, но я переформулировал свой вопрос здесь: lists/35782803#35782803" title="создание экземпляров класса на основе списков динамических элементов"> stackoverflow.com/questions/35782580/ - person Jose Cancel; 04.03.2016

На самом деле это то, что говорит Джон, но чтобы перейти от ваших параллельных списков к одному списку Джона, вам нужно что-то вроде (при условии, что все списки имеют одинаковое количество элементов в одном и том же порядке):

Users = new List<User>();
for (var i = 0; i < name.Count; i++)
{
    Users.Add(new User
    {
        Available = available[i],
        ImageUrl = userImageURL[i],
        Info = info[i],
        Name = name[i],
        NickName = nickname[i]
    });
}

Затем сериализуйте список пользователей.

person fistix    schedule 29.02.2016