标签: json-patch

如何通过比较两个c#对象来创建JsonPatchDocument?

鉴于我有两个相同类型的c#对象,我想比较它们来创建一个JsonPatchDocument.

我有一个像这样定义的StyleDetail类:

public class StyleDetail
    {
        public string Id { get; set; }
        public string Code { get; set; }
        public string Name { get; set; }
        public decimal OriginalPrice { get; set; }
        public decimal Price { get; set; }
        public string Notes { get; set; }
        public string ImageUrl { get; set; }
        public bool Wishlist { get; set; }
        public List<string> Attributes { get; set; }
        public ColourList Colours { get; set; }
        public SizeList Sizes { …
Run Code Online (Sandbox Code Playgroud)

c# json-patch

17
推荐指数
1
解决办法
4821
查看次数

从两个对象生成JSON补丁

给定两个Javascript对象(AB),有没有办法生成JSON补丁,以便在应用该补丁A时将对象的属性更改为对象的属性B

例如,给定假设JSONPatch函数(可能是与下面链接的函数之一相似的名称的函数),期望的是generate_patch函数.

patch = generate_patch(A, B) JSONPatch.apply(patch, A) # modifies A so that it has the same properties as B.

在这个问题A,B是Javascript对象.RFC6902创建的补丁是JSON,它表示应用于A该对象的操作数组B.该generate_patch函数不需要返回JSON,而是为了提高效率可以返回一个Javascript对象,该对象在JSON.stringify调用时成为RFC6902 JSON补丁文档.

我在这个主题上找到的项目是:

javascript json json-patch

16
推荐指数
2
解决办法
5991
查看次数

Kustomize 中的补丁与补丁Json6902 有什么区别

根据我阅读的文档,有 3 种修补方法:

  • 补丁
  • 补丁策略合并
  • 补丁Json6902。

patchesStrategicMerge和之间的区别patchesJson6902很明显。patchesStrategicMerge需要 kubernetes 资源的重复结构来标识正在修补的基本资源,然后是规范的修改部分以指示更改(或删除)的内容。

patchesJson6902 定义了一个 'target' 属性,用于指定 kubernetes 资源和一个 'path' 属性,该属性指定资源中的哪个属性被修改、添加或删除。

但是,什么是我不明白之间的差别patchespatchesJson6902。它们在性质上似乎非常相似。两者都指定了一个“目标”属性和描述被修改内容的操作对象。

我注意到的唯一区别是patches不需要“组”属性,而需要patchesJson6902;原因不明。

那么为什么两者之间存在差异呢?我如何确定使用哪一个?

patch json-patch kubernetes kustomize

13
推荐指数
1
解决办法
4793
查看次数

使用JSON Patch将值添加到字典中

概观

我正在尝试使用ASP.NET Core编写Web服务,允许客户端查询和修改微控制器的状态.该微控制器包含我在我的应用中建模的许多系统 - 例如,PWM系统,执行器输入系统等.

这些系统的组件都具有可以使用JSON补丁请求查询或修改的特定属性.例如,可以使用携带的HTTP请求启用微型上的第4个PWM .为了支持这一点,我正在使用该库.{"op":"replace", "path":"/pwms/3/enabled", "value":true}AspNetCore.JsonPatch

我的问题是我正在尝试为新的"CAN数据库"系统实现JSON补丁支持,该系统在逻辑上应该将定义名称映射到特定的CAN消息定义,我不知道如何解决这个问题.

细节

下图为CAN数据库系统建模.一个CanDatabase实例理应包含形式的字典IDictionary<string, CanMessageDefinition>.

CAN数据库系统模型

为了支持创建新的消息定义,我的应用程序应该允许用户发送如下的JSON补丁请求:

{
    "op": "add",
    "path": "/candb/my_new_definition",
    "value": {
        "template": ["...", "..."],
        "repeatRate": "...",
        "...": "...",
    }
}
Run Code Online (Sandbox Code Playgroud)

这里,my_new_definition将定义定义名称,并且value应将与之关联的对象反序列化为CanMessageDefinition 对象.然后应将其存储为CanDatabase字典中的新键值对.

问题是,path应指定属性路径这对于静态类型的对象将是......嗯,静态的(一个例外是,它允许引用数组元素,例如/pwms/3如上).

我试过的

A. Leeroy Jenkins的方法

忘记我知道它不会工作的事实- 我尝试了下面的实现(尽管我需要支持动态JSON补丁路径,但它只使用静态类型)只是为了看看会发生什么.

履行

internal sealed class CanDatabaseModel : DeviceComponentModel<CanDatabaseModel>
{
    public CanDatabaseModel() …
Run Code Online (Sandbox Code Playgroud)

c# json-patch

12
推荐指数
1
解决办法
3539
查看次数

从阵列中删除元素的JSON Patch格式是什么?

我有以下JSON文档,我想从中删除"roles"字段的数组值中的"roleId2"元素:

{
  "id" : 12345,
  "firstName": "SomeFirstName",
  "lastName": "SomeLastName",
  "roles":["roleId1", "roleId2", "roleId3"]
}
Run Code Online (Sandbox Code Playgroud)

如何编写JSON补丁文档来删除该元素?以下表达式是否有效?

{"op": "remove", "path":"/roles", "value": "roleId2"}
Run Code Online (Sandbox Code Playgroud)

或者,它应该是这样的(因为文档中的"角色"值是一个数组)?

{"op": "remove", "path":"/roles", "value": ["roleId2"]}
Run Code Online (Sandbox Code Playgroud)

从阅读RFC 6902,我不清楚哪一个 - 如果 - 是正确的.RFC提到了以下行为,但我不确定它是否与此相关.

如果从数组中删除元素,则指定索引上方的任何元素都会向左移动一个位置.

json-patch

11
推荐指数
2
解决办法
5798
查看次数

修改Spring Data Rest中的@OneToMany实体而不使用其存储库

在项目中,我使用的类型的对象一个具有一对多的关系(orphanRemoval = TRUE,级联= CascadeType.ALL,取= FetchType.EAGER)至类型的对象.我需要SpringDataRest(SDR )使用单个POST请求来存储完整的完整A对象及其B对象(子对象).我在SDR中尝试了几种组合,唯一对我有用的组合是为对象A创建@RepositoryRestResource并为对象B创建@RepositoryRestResource ,但是将此(B)标记为exported = false(如果我没有创建存储库)在对象B之外,它不起作用 - >只是一个对象将存储在单个POST请求中,而不是它的子类型(@OneToMany关系)类型B ;如果B存储库省略了exported = false,则会出现相同的结果).这是否正确,以及如何实现它的唯一方法(单个POST请求同时存储所有对象)?

我之所以要问,在我之前的例子中,我必须(我想)通过使用A的存储库来控制所有对象"生命周期" .我很好,因为A - > B关系是组合(B不存在于A之外).但是我有严重的问题,即使用其父存储库通过SDR 编辑(也删除)B类型的某个对象(因为对象B没有导出自己的存储库).也许,根据定义,这是不可能的.我试过这些解决方案:

  • "/ A/1/B/2"的PATCH不起作用 - >方法不允许(在标题中是"允许:GET,DELETE") - >所以,PUT也是不可能的
  • 使用json补丁内容类型[{"op":"add","path":"/ B/2",....}] - > JCH Patch也无法使用 - PATCH for"/ A/1" "目标数组中没有这样的索引" - 因为Json Patch在"array"之后使用标量"2"作为其数组的索引.这在Java世界中是不实际的,当关系保存在对象集中时 - 索引根本就没有意义.
  • 我可以导出对象B的存储库(exported = true)以"直接"操作它,但是这样我就会失去将整个对象 …

java rest spring-data-rest json-patch

11
推荐指数
1
解决办法
6927
查看次数

保护Spring Boot Data Rest应用程序中的JSON-PATCH路径

我正在使用漂亮的vanilla spring-boot-starter-data-rest设置并启用该PATCH方法.一切正常,但我有一个安全问题,并想知道缓解它的建议方法是什么.

问题是PATCH paths允许从不同的端点更新可到达的实体.所以,假设我有一个comments端点和一个article端点.每条评论与其文章都有一对一的关联.有权编辑评论的用户可以执行以下操作:

PATCH http://some.domain.foo/api/comments/1234
Content-Type: application/json-patch+json

[
    { "op": "replace", "path": "/article/title", "value": "foobar2" }
]
Run Code Online (Sandbox Code Playgroud)

从而改变文章的标题!!

显然这不好.

在这种情况下,对于API的其他部分,与"文章"的关联需要是可遍历的.但它必须是只读的.

那么......我怎么在春天完成这个?

拦截请求?实现处理程序方法?从头开始编写我自己的Controller?

谢谢!

java spring spring-mvc json-patch

11
推荐指数
1
解决办法
2299
查看次数

尝试从 Blazor Wasm 调用 AspNetCore Restful API 时出现“TypeError: Failed to fetch”错误

尝试从 Blazor Wasm 调用我的 AspNetCore Restful API 时,出现“TypeError: Failed to fetch”错误。我可以从邮递员那里调用它,它工作正常。

我的环境: Microsoft Visual Studio Community 2019 Preview Version 16.6.0 Preview 3.0

客户端:Blazor Wasm 服务(dotnetstandard 2.1)

  • AspNet.WebApi.Client 5.2.7
  • AspNetCore..WebAssembly 3.2 预览版 4.2
  • System.Net.Http.Json 3.2 预览版 5.2

重要用途:

using Microsoft.AspNetCore.JsonPatch;
using Newtonsoft.Json;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Http.Json;
Run Code Online (Sandbox Code Playgroud)

父命名空间和类省略 _httpClient 注入父类

public async Task<MyDto> UpdatePartialAsync(Guid primaryId, ObjectForUpdateDto objectForUpdateDto)
{

    MyDto dtoFromApi = null;

    var patchDoc = new JsonPatchDocument<ObjectForUpdateDto>()
        .Replace(o => o.Name, objectForUpdateDto.Name)
        .Replace(o => o.Description, objectForUpdateDto.Description)

    var uri = $"MyUri/myResources/{primaryId}";

    try …
Run Code Online (Sandbox Code Playgroud)

httpclient json-patch asp.net-core .net-standard blazor-client-side

9
推荐指数
2
解决办法
5169
查看次数

Spring Data Rest - PATCH Postgres jsonb字段

简短版本是:如何jsonb使用Spring Data Rest PATCH方法修补Postgres 字段中包含的JSON对象?

这是长版本,请考虑以下实体:

@Entity
@Table(name = "examples")
public class Example {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String jsonobject;

    @JsonRawValue
    public String getJsonobject() {
        return jsonobject == null ? null : jsonobject;
    }

    public void setJsonobject(JsonNode jsonobject) {
        this.jsonobject = jsonobject == null ? null : jsonobject.toString();
    }
}
Run Code Online (Sandbox Code Playgroud)

jsonobject是Postgres类型jsonb.这些getter/setter是为这里提到的Spring Data Rest序列化/反序列化它的方法.我们还尝试给该字段提供自己的类型,如这些答案中所述.

我们的目标是使用Spring Data Rest修补此字段包含的JSON对象.

例如:

GET /examples/1
{
    "id": 1,
    "jsonobject": {
         "foo": {"bar": …
Run Code Online (Sandbox Code Playgroud)

postgresql spring spring-data-rest json-patch jsonb

8
推荐指数
1
解决办法
1644
查看次数

在单个 JSON Patch 操作中向数组添加多个值?

我有一个像这样的 json 对象:

{
    "content" : [
        {
            "id" : 54
            "foo" : "bar"
        },
        {
            "id" : 43
            "foo" : "bar"
        },
        {
            "id" : 76
            "foo" : "bar"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果我想向内容数组添加多个项目(顺序无关紧要),我可以使用带有单行/操作的 json 补丁添加到它吗?

{ "op": "add", "path": "/content/-", "value": [
        {
            "id" : 34
            "foo" : "bar"
        },
        {
            "id" : 23
            "foo" : "bar"
        },
        {
            "id" : 87
            "foo" : "bar"
        }
    ] 
}
Run Code Online (Sandbox Code Playgroud)

或者我是否必须为每个要添加的对象添加一行?

编辑:要清楚我想追加,而不是替换内容。

arrays rest json http json-patch

8
推荐指数
1
解决办法
995
查看次数