向现有 jsonpatch 文件添加新操作

Add new operations to existing jsonpatch file

我正在为一些使用 jsonpatch 修改数据库条目的 Java 代码编写测试套件。我想要做的是将一个模板 jsonpatch 请求保存为一个文件,各个单元测试可以从中读取,修改一些操作,然后直接调用补丁。

大致结构如下:

jsonpatch 模板:

"jsonPatch": [
  {
    "op": "replace",
    "path": "/username",
    "value": "johnDoe"
  },
  {
    "op": "replace",
    "path": "/number",
    "value": 123
  }
]

java代码:

// Import Template
JsonPatch request;
InputStream is = TestRestTemplate.class.getResourceAsStream("/PatchRequest.json");
request = objectMapper.readValue(is, JsonPatch.class)

// Modify Operations (not working)
Random r = new Random();
int newNumber = r.nextInt(100);
((ObjectNode) request).put("/number", newNumber);  // this doesn't even compile due to conversion issues

// Send patch
thingThatTouchesDB.patchDocument(request)

// Validate Results
int finalNumber = [get field from DB]
assertEquals(newNumber, finalNumber);

当我注释掉修改操作部分时,一切正常,所以我在导入或发送补丁时没有问题。我的努力是更新模板的操作以适应。路径在测试中是相同的,但我每次都需要尝试不同的值,因为我们使用持久数据库进行测试。

有没有办法像我在上面尝试的那样修改现有 jsonpatch 操作的值?如果做不到这一点,我可以向现有的 jsonpatch 添加新操作吗?

经过大量试验和错误后,我通过修改输入流本身而不是 json 补丁对象使其工作。

我在 json 模板中添加了一些目标,并在输入流的副本上进行了流替换,以强制输入我想要的值,然后再将其全部转换为最终的 json 补丁。

新模板:

"jsonPatch": [
  {
    "op": "replace",
    "path": "/username",
    "value": "$username$"
  },
  {
    "op": "replace",
    "path": "/number",
    "value": "$number$"
  }
]

新密码:

// Import Template
JsonPatch request;
InputStream is = TestRestTemplate.class.getResourceAsStream("/PatchRequest.json");
byte[] bytes = FileCopyUtils.copyToByteArray(is);
String requestStr= new String(bytes);
    
// Modify Operations
Random r = new Random();
int newNumber = r.nextInt(100);
requestStr= requestStr.replaceAll("\"\$number\$\"", String.valueOf(newNumber));
requestStr= requestStr.replaceAll("\$username\$", "NewName");

// Finalize Request
request = objectMapper.readValue(requestStr, JsonPatch.class)

让数字值起作用有点棘手,因为一切都是字符串,但我能够通过替换操作摆脱它的引号来破解它,这导致它被 json补丁.