首页 > 解决方案 > 使用分隔路径/键将复杂对象添加到 JObject

问题描述

我正在使用 Jsons,我不知道它们的高级结构。举个例子:

{
    "OrganizationData": {
        "Org1": {
            "Name": "Rega And Dodli",
            "EmployessNum": "100000000"
         },
         "Org2": {
            "Name": "Sami And Soso",
            "EmployessNum": "2"
         }
    }
}

我目前正在通过使用SelectToken可以将带有子键的键传递给的方法来获取值,如下所示:

var token = myJObject.SelectToken("OrganizationData.Org1")

这工作正常。现在我想使用这样的字符串向 JSON 添加一个新条目,例如:

myJObject.Add("OrganizationData.Org3", myValueJson);

但是像这样直接调用 add 只是向 json 添加一个名为“OrganizationData.Org3”的新键,而不是像当前的“Org1”和“Org2”那样在“OrganizationData”中创建一个名为“Org3”的新子键。

如何使用需要的分隔字符串添加新值?

标签: c#jsonjson.net

解决方案


JSON 没有子键或分隔键。OrganizationData.Org1是 LINQ to JSON 搜索表达式,而不是子键。

要添加Org3,您可以使用多种方法之一来修改 JSON 对象。您可以将子元素OrganizationData或兄弟元素添加到其他Org节点之一。

要将子元素添加到节点,.SelectToken("OrganizationData")如果您还没有对它的引用,则可以使用它,并使用它JObject.Add来添加新节点。您必须将结果转换为JObject第一个,因为SelectToken返回一个JToken. 如果有可能OrganizationData是一个数组,你也必须检查类型。

例如:

var token = myJObject.SelectToken("OrganizationData");
if(token is JObject orgObj)
{
    orgObj.Add("Org3",myValueJson);
}

使用未知路径

如果在运行时指定路径,同样的事情也有效。在这种情况下,所需要的只是将最后一部分与路径的其余部分分开,可能使用String.LastIndexOf`

var lastDot=path.LastIndexOf('.');
if (lastDot<0)
{
    //Oops! There's no dot. What do we do now?
}
var parent=path.Substring(0,lastDot);
var key=path.Substring(lastDot+1);

var token = myJObject.SelectToken(parent);
if(token is JObject orgObj)
{
    orgObj.Add(key,myValueJson);
}

如果路径不包含点,您必须决定要做什么。这是无效路径吗?还是应该在根对象下添加一个新对象?


推荐阅读