我已经进行了很多搜索,似乎没有针对此特定情况的文章。
我有一些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内部的嵌套对象来做到这一点。
有人可以帮助或建议一些方法吗?我敢肯定这可能很简单,但是我正在经历一个循环,试图找出答案。
答案 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();
}