【问题标题】:NodeJs: modify json object with non-strict jsonpathNodeJs:使用非严格的 jsonpath 修改 json 对象
【发布时间】:2015-04-08 14:52:51
【问题描述】:

在我的工作中,我需要测试新的 api 服务。它的发展速度非常快,请求体庞大。

为了自动化 xml api 测试,当您设置相对路径和更改找到的元素的值时,我发现了非常合适的方法。只需使用允许此类方法的 xpath 即可完成。

但如果是 json,我只是库存。名为jsonpath 的主要 npm 模块仅返回元素,但不允许像 xpath 那样获取某些参数并更改其值。

在这种情况下,我的问题是我想编写漂亮的测试,如果我将使用绝对路径编写它们,那么长字符串它们可能会非常难看,并且在比较中也会有更多的打字工作较短的相对路径。

那么如何解决这个问题来实现这个目标呢?

使用 json 路径的 npm 模块列表

  1. json patch: 想要绝对路径,并且据我所知还有丑陋的方式来改变 jsons。
  2. json path:仅从搜索结果中返回单独的值。
  3. json-path-processor:有set方法,但也想要绝对路径。

更新

对不起,问题不在于文件路径,而在于使用内部元素的路径更改 json 对象内部的值。

我想在 json 中为 d 元素设置值 2

{ a: { b: { c: [{ d: 1 }] } } }

使用$..c[0].d 之类的路径代替路径$.a.b.c[0].d

【问题讨论】:

  • require('path').resolve('../..')
  • @Plato 谢谢你,Plato,我可以用它改变 json 对象中的值吗?

标签: json node.js


【解决方案1】:

考虑使用object-scan。一旦你把头绕在它周围,它就会很强大。我相信你也可以用它解决你的其他用例。

// const objectScan = require('object-scan');

const update = (needle, value, input) => objectScan([needle], {
  abort: true,
  rtn: 'bool',
  filterFn: ({ parent, property }) => {
    parent[property] = value;
  }
})(input);

const obj = { a: { b: { c: [{ d: 1 }] } } };

console.log(update('**.d', 2, obj)); // true iff replacement was made
// => true
console.log(obj);
// => { a: { b: { c: [ { d: 2 } ] } } }
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-scan@13.7.1"></script>

免责声明:我是object-scan的作者

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    相关资源
    最近更新 更多