 |
|
9
zictos Feb 11, 2023 1
chatgpt 的答案能参考吗? 推荐使用 jsonc-parser 库,它可以解析带注释的 JSON ,然后根据需要更新 JSON 对象并生成新的 JSON string 。下面是一个示例代码,可以实现题目要求的功能:
const { parseTree, findNodeAtLocation, applyEdits, modify } = require("jsonc-parser");
function updatePackage(jsonStr, packageName, packageData) { const ast = parseTree(jsonStr); const subpackagesNode = findNodeAtLocation(ast, ["subpackages"]); const packageIndex = subpackagesNode.children.findIndex( (child) => findNodeAtLocation(child, ["value", "name"]).value === packageName ); if (packageIndex !== -1) { const packageNode = subpackagesNode.children[packageIndex]; const edits = modify(jsonStr, packageNode.offset, packageNode.length, JSON.stringify(packageData)); return applyEdits(jsonStr, edits); } else { const edits = modify(jsonStr, subpackagesNode.offset + subpackagesNode.length - 1, 0, `,${JSON.stringify(packageData)}`); return applyEdits(jsonStr, edits); } }
const jsonStr = `{ "pages": ["pages/index/index"], "subpackages": [ { "name": "A", "pages": ["innerModule/pages/index/index"] }, { "name": "B", "pages": ["innerModule/pages/index/index"] } ] }`;
console.log(updatePackage(jsonStr, "C", { name: "C", pages: ["pages/C/index"] }));
在上面的代码中,updatePackage 函数接收一个 JSON string 、需要更新的包名和包数据。它首先使用 jsonc-parser 解析 JSON string ,然后在 AST 中查找 subpackages 节点。然后它在 subpackages 的子节点中查找与给定包名匹配的节点,如果找到了就将它替换为给定的包数据,否则就将包数据添加到 subpackages 的末尾。最后,它将生成的新 JSON string 返回。
由于使用 jsonc-parser 解析 JSON string 时可以保留格式信息,因此在 CI 中就不会产生额外的 diff 了。
|