Добавление нескольких свойств во вложенный массив JSON - PullRequest
0 голосов
/ 25 февраля 2019

Я много занимался поиском, похоже, нет статьи для этого конкретного случая.

У меня есть некоторый JSON (обратите внимание, что это JArray, а не JObject)

[
  {
    "Name": "Name 1",
    "Icon": "Icon 1",
    "Samples": [
      {
        "Name": "Sample 1",
      },
      {
        "Name": "Sample 2",
      },
      {
        "Name": "Sample 3",
      }
    ]
  },
  {
    "Name": "Name 2",
    "Icon": "Icon 2",
    "Samples": [
      {
        "Name": "Sample 1",
      },
      {
        "Name": "Sample 2",
      },
      {
        "Name": "Sample 3",
      }
    ]
  },
  {
    "Name": "Name 3",
    "Icon": "Icon 3",
    "Samples": [
      {
        "Name": "Sample 1",
      },
      {
        "Name": "Sample 2",
      },
      {
        "Name": "Sample 3",
      }
    ]
  },
]

Так что у него есть 3 уровня.Корень, который содержит «SampleCategories».«SampleCategories», который содержит некоторые элементы и список «Samples», и «Samples», который содержит много объектов.

Итак, что я по сути пытаюсь сделать здесь, это добавить объект вСписок образцов, внутри определенной SampleCategory.Например:

Я хочу добавить «Образец 4» в массив «Образцы» в «Имя 1», чтобы он выглядел так:

  {
    "Name": "Name 1",
    "Icon": "Icon 1",
    "Samples": [
      {
        "Name": "Sample 1",
      },
      {
        "Name": "Sample 2",
      },
      {
        "Name": "Sample 3",
      },
      {
        "Name": "Sample 4",
      }
    ]
  },

Я думал, что это будет довольно легко, когдаЯ начал, но оказалось, что есть много препятствий, которые я не могу осознать.

Так что у меня есть две модели для каждого уровня, «SampleCategory» для верхнего уровня, который имеет Имя, Icon and Samples, которая относится к другой модели под названием «Samples []»

Так что я боюсь, что в этом процессе я нахожусь в затруднительном положении ... С самого начала.Я десериализовал json, сделал несколько шагов по поиску выбранной SampleCategory и создал готовый для добавления объект, и это все, что я получил ...

var categories = JsonConvert.DeserializeObject<List<SampleCategory>>(json);
var applications = categories.Find(c => c.Name.Equals("Name 1"));

var sample = new Sample
{
    Name = "Sample 4",
};

IПо-видимому, не удается найти какой-либо способ добавления нового «образца» в список «Образцы» выбранной категории «Образец».Я даже пытался добавить к объектному пути напрямую , путь которого я получил используя это:

JObject jo = jsonArray.Children<JObject>().FirstOrDefault(o => o["Name"] != null && o["Name"].ToString() == "Name 1");

Но, похоже, нет способа добавить массив в видеЯ полагаю, это статическая длина?

Как лучше всего модифицировать JSON следующим образом?

Документация (https://www.newtonsoft.com/json/help/html/ModifyJson.htm) предлагает несколько способов сделать это при игре с объектами JObjects, но не предлагает способ сделать это с вложенными объектами внутри JArrays.

Может кто-нибудь помочь или предложить какие-то методы для этого? Я уверен, что это, вероятно, просто, но я прохожу цикл, пытаясь выяснить это.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Полагаю, ваша модель выглядит примерно так:

public class Sample
{
    public string Name { get; set; }
}

public class SampleCategory
{
    public string Name { get; set; }
    public string Icon { get; set; }
    public List<Sample> Samples { get; set; }
}

Если вы не уверены, как должна выглядеть модель, чтобы соответствовать заданной строке json, вы можете использовать инструмент, подобный json2csharp, которая сгенерирует модель для вас.

Чтобы добавить новый образец к определенной категории, вы можете найти определенную категорию, используя LINQ после десериализации ее:

var categories = JsonConvert.DeserializeObject<List<SampleCategory>>(json);
var category = categories.FirstOrDefault(c => c.Name == "Name 1");

Теперь (если категория с именем существует) просто добавьте новый образец в список:

if(category != null)
{
    category.Samples.Add(new Sample{Name = "Sample 4"});
}

Чтобы сериализовать его обратно в json:

var json = JsonConvert.SerializeObject(categories);

Редактировать
Если вы не можете переключить тип вашей модели для Samples на List<T> и не хотите временно преобразовывать массив в List<T>, вы можете сделать что-то вроде этого:

if(category != null)
{
    category.Samples = category.Samples.Concat(new Sample[]{new Sample{Name = "Sample 4"}}).ToArray();
}

Если вас не беспокоит дополнительное List<T> приведение, другой подход будет:

if(category != null)
{
    var tmpList = category.Samples.ToList();
    tmpList.Add(new Sample{Name = "Sample 4"});
    category.Samples = tmpList.ToArray();
}
0 голосов
/ 25 февраля 2019

Я не уверен, но это может быть так просто:

applications.Samples.ToList().Add(sample);

У меня нет привилегии комментировать это: (

...