将多个属性添加到嵌套JSON数组

时间:2019-02-25 14:46:09

标签: c# json asp.net-core uwp json.net

我已经进行了很多搜索,似乎没有针对此特定情况的文章。

我有一些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”的Samples数组中,因此看起来像这样:

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

我认为刚开始时这会很容易,但事实证明,有很多障碍似乎无法解决。

因此,我每个级别都有两个模型,顶层是“ SampleCategory”,具有“名称”,“图标”和“样本”,然后转到另一个名为“ 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",
};

我似乎找不到任何方法可以将新的“样本”添加到所选SampleCategory的“样本”列表中。我什至尝试直接将对象路径 添加到对象路径中,

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 :(得分:1)

我不确定,但是可能很简单:

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

我无权对此发表评论:(

答案 1 :(得分:1)

我猜你的模型看起来像这样:

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