鉴于我有两个相同类型的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) 给定两个Javascript对象(A和B),有没有办法生成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补丁文档.
我在这个主题上找到的项目是:
根据我阅读的文档,有 3 种修补方法:
patchesStrategicMerge和之间的区别patchesJson6902很明显。patchesStrategicMerge需要 kubernetes 资源的重复结构来标识正在修补的基本资源,然后是规范的修改部分以指示更改(或删除)的内容。
patchesJson6902 定义了一个 'target' 属性,用于指定 kubernetes 资源和一个 'path' 属性,该属性指定资源中的哪个属性被修改、添加或删除。
但是,什么是我不明白之间的差别patches和patchesJson6902。它们在性质上似乎非常相似。两者都指定了一个“目标”属性和描述被修改内容的操作对象。
我注意到的唯一区别是patches不需要“组”属性,而需要patchesJson6902;原因不明。
那么为什么两者之间存在差异呢?我如何确定使用哪一个?
我正在尝试使用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>.

为了支持创建新的消息定义,我的应用程序应该允许用户发送如下的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) 我有以下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提到了以下行为,但我不确定它是否与此相关.
如果从数组中删除元素,则指定索引上方的任何元素都会向左移动一个位置.
在项目中,我使用的类型的对象一个具有一对多的关系(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没有导出自己的存储库).也许,根据定义,这是不可能的.我试过这些解决方案:
我正在使用漂亮的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?
谢谢!
尝试从 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)
重要用途:
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
简短版本是:如何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) 我有一个像这样的 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)
或者我是否必须为每个要添加的对象添加一行?
编辑:要清楚我想追加,而不是替换内容。
json-patch ×10
c# ×2
java ×2
json ×2
rest ×2
spring ×2
arrays ×1
asp.net-core ×1
http ×1
httpclient ×1
javascript ×1
jsonb ×1
kubernetes ×1
kustomize ×1
patch ×1
postgresql ×1
spring-mvc ×1