c# - 使用分隔路径/键将复杂对象添加到 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”的新子键。
如何使用需要的分隔字符串添加新值?
解决方案
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);
}
如果路径不包含点,您必须决定要做什么。这是无效路径吗?还是应该在根对象下添加一个新对象?
推荐阅读
- javascript - 创建 CSV 时遇到问题,分隔符
- excel - 为什么 VBA 读取我的 ElseIf 语句但不执行它下面的代码?
- windows - 在 Windows 中如何编码 unicode 字符串(宽字符串)?UTF-16LE 还是 UTF-16BE?
- aws-amplify - 放大 API 参考
- docker - docker-compose build 时如何从 Dockerfile 连接到其他容器
- autodesk-forge - Forge Viewer Extension for Toolbar:如何添加自定义组合框
- hangouts-chat - 环聊聊天机器人“来电者没有权限”,PERMISSION_DENIED
- c# - C#适用于linux?
- php - 如何使用 RPC 生成钱包和检索比特币钱包
- python - 在我们之前设置 request.session