json - 在 ASP.NET Core 中使用 JsonPatch 将项目添加到字典中

标签 json asp.net-core .net-core json-patch

我有以下环境和.NET Core版本

.NET SDK (reflecting any global.json):
 Version:   5.0.100
 Commit:    5044b93829

Runtime Environment:
 OS Name:     Mac OS X
 OS Version:  11.0
 OS Platform: Darwin
 RID:         osx.11.0-x64
 Base Path:   /usr/local/share/dotnet/sdk/5.0.100/

使用以下代码和端点。

public class Trie
{
    public string Id { get; set; }

    public Dictionary<string, TrieNode> Nodes { get; set; }
}

public class TrieNode
{
    public string Name { get; set; }
}
public async Task<IActionResult> Patch(string id, [FromBody] JsonPatchDocument<Trie> patchDoc)
{
    var trie = [get from database]
    patchDoc.ApplyTo(trie, ModelState);
}

当我使用以下操作时:

[
  {
    "op": "add",
    "path": "/nodes/-", "value": { "/": { "name": "hello, world" } }
  }
]

一个项目被添加到字典中,如下所示:

"Nodes": {
    "-": {
        "Name": null
    }
}

如果我对操作使用以下语法

[
  {
    "op": "add",
    "path": "/nodes", "value": { "/": { "name": "hello, world" } }
  }
]

该项目的添加方式如下:

"Nodes": {
    "/": {
        "Name": "hello, world"
    }
}

但是当我尝试使用另一个键添加新项目时,如下所示:

[
  {
    "op": "add",
    "path": "/nodes", "value": { "/my-key": { "name": "hello, world" } }
  }
]

该项目添加,它替换了第一个条目,因此结果如下所示:

"Nodes": {
    "/my-key": {
        "Name": "hello, world"
    }
}

如何添加、删除、替换、复制、移动字典中的条目

最佳答案

您使用的格式将设置整个属性值(设置为仅包含一个条目的字典)。这就是为什么您看到它已添加但未更新。

对于通过 key 更新条目,看起来这在任何地方都没有记录。更新 key (添加或更新现有 key )的实际语法如下:

/path-to-dictionary/string-key

上面的路径也针对remove的现有条目。

应该只是条目值(不包括代码中的键),如下所示:

{ "name": "hello, world" }

以下是不同操作的示例格式:

添加或更新:

[
  {
    "op": "add",
    "path": "/nodes/my-key", 
    "value": { "name": "hello, world" }
  }
]

删除:

[
  {
    "op": "remove",
    "path": "/nodes/my-key"
  }
]

替换:这实际上类似于现有 key 的添加

[
  {
    "op": "replace",
    "path": "/nodes/my-key",
    "value": { "name": "hello, world" }
  }
]

复制:

[
  {
    "op": "copy",
    "from": "/nodes/my-existing-key",
    "path": "/nodes/my-key"
  }
]

移动:

[
  {
    "op": "move",
    "from": "/nodes/my-existing-key",
    "path": "/nodes/my-key"
  }
]

注意:字典的路径格式要求字典属性非空。否则,该路径将被视为不存在,并会抛出错误,并显示如下消息:

... the target location specified by path '/nodes/my-key' was not found

根据代码中使用的格式,将设置整个字典属性。这就是为什么总是保留一个条目(最后一个条目会覆盖所有其他条目,包括现有条目)。有了这个注释,您应该确保首先初始化您的字典属性,如下所示:

if(trie.Nodes == null){
   trie.Nodes = new Dictionary<string, TrieNode>();
}
patchDoc.ApplyTo(trie, ModelState);

关于字典键类型:

在您的示例中,键类型是 string,但它可以是任何类型,只要您有关联的 TypeConverter 即可使该类型正常工作。例如:它可以是 int 所以你可以正常使用 int 键,它可以是 DateTime 所以你可以使用像 yyyy-MM-dd 这样的键格式>(在路径中使用)...

关于json - 在 ASP.NET Core 中使用 JsonPatch 将项目添加到字典中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66723977/

相关文章:

c# - ASP.NET Identity UserStore中GetNormalizedUserNameAsync和SetNormalizedUserNameAsync函数的解释

c# - 我的 XUnit dotnet 核心项目在我的桌面上构建,但不在 DevOps Server 2019 中构建

javascript - 从具有父子引用的数组创建树结构

javascript - 如何在不解析的情况下在javascript中同步包含JSON数据?

c# - asp.net core 中的 app.RunIISPipeline() 需要哪些引用资料?

docker - 如何在Linux上运行Visual Studio 2019生成的Dockered ASP.net核心应用程序? SSL配置问题

azure - 将角色名称添加到 Application Insights 遥测

python - 将列表列表转换为字符串列表

json - 如何生成geoJson数据?

razor - ASP.NET 核心页面 : Partials