这不是求助, 只是想看看大家会怎么处理这个需求.
需求:
有 json 如下, 实际 json 数组要更长, 这里只用 3个 作示例
[
{
"type": "防具",
"name": "八卦阵",
"effect": "每当你需要使用(或打出)一张【闪】时,你可以进行一次判定:若结果为红色,则视为你使用(或打出)了一张【闪】;若为黑色,则你仍可以从手牌里使用(或打出)。"
},
{
"type": "防具",
"name": "仁王盾",
"effect": "锁定技,黑色的【杀】对你无效。"
},
{
"type": "防御马",
"name": "的卢",
"effect": "+1马"
},
]
需要在每个对象的 name
属性下添加新的属性 imgSrc
, 并且其值为 “/” + name
的值 + “.png”.
预期结果:
[
{
"type": "防具",
"name": "八卦阵",
"imgSrc": "/八卦阵.png",
"effect": "每当你需要使用(或打出)一张【闪】时,你可以进行一次判定:若结果为红色,则视为你使用(或打出)了一张【闪】;若为黑色,则你仍可以从手牌里使用(或打出)。"
},
{
"type": "防具",
"name": "仁王盾",
"imgSrc": "/仁王盾.png",
"effect": "锁定技,黑色的【杀】对你无效。"
},
{
"type": "防御马",
"name": "的卢",
"imgSrc": "/的卢.png",
"effect": "+1马"
},
]
XQuery 也行
xquery version "3.1";
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare namespace map = "http://www.w3.org/2005/xpath-functions/map";
declare option output:method "json";
array {
for $node in json-doc("test.json")?*
return map:put($node, 'imgSrc', '/'|| $node?name ||'.png')
}
用 XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xpath-default-namespace="http://www.w3.org/2005/xpath-functions"
version="3.0">
<xsl:output method="json"/>
<xsl:template match=".[. instance of array(map(xs:string, xs:string))]">
<xsl:variable name="items" as="item()*">
<xsl:apply-templates select="?*"/>
</xsl:variable>
<xsl:sequence select="array{ $items }"/>
</xsl:template>
<xsl:template match=".[. instance of map(xs:string, xs:string)]">
<xsl:sequence select="map:put(., 'imgSrc', '/'|| ?name ||'.png')"/>
</xsl:template>
</xsl:stylesheet>
$ transform -json:test.json -xsl:trans.xsl | json_xs
$ query -q:trans.xq | json_xs
[
{
"effect" : "每当你需要使用(或打出)一张【闪】时,你可以进行一次判定:若结果为红色,则视为你使用(或打出)了一张【闪】;若为黑色,则你仍可以从手牌里使用(或打出)。",
"imgSrc" : "/八卦阵.png",
"name" : "八卦阵",
"type" : "防具"
},
{
"effect" : "锁定技,黑色的【杀】对你无效。",
"imgSrc" : "/仁王盾.png",
"name" : "仁王盾",
"type" : "防具"
},
{
"effect" : "+1马",
"imgSrc" : "/的卢.png",
"name" : "的卢",
"type" : "防御马"
}
]
2 个赞
用 markmacro, GitHub - manateelazycat/markmacro: Keyboard macro for marked regions
- 全选
- markmacro-secondary-region-set
- 移动光标到任意一个 name 的位置
- markmacro-mark-words
- C-e 移动到行尾
- 正常写
"imgSrc": "",
- markmacro-apply-all, 这样会在所有 name 下面都插入 imgSrc
只针对这个需求,我会使用正则替换
\("name": "\(.*\)",\) => \1"imageSrc":"/\2.png",
4 个赞
xqliu
5
我会告诉 gpt 现在的背景信息,然后让 chatgpt 推荐用什么实现以及怎么实现,然后再让他写个代码实现,然后再让他帮写一个测试脚本再造一些测试数据
1 个赞
在 Emacs China 上发帖,从回复中挑一个
10 个赞
写几行代码解决咯,读输入,解析json,给imgsrc赋值,输出,结束。
菜鸟路过
let arrJson = [ { } ] // 你的数组
console.log(JSON.stringify(
arrJson.map(a => {
return {
...a,
imgSrc:`/${a.name}.png`,
}
})
))
jq 有语法解析器和一堆内置函数。
jq 'map(.+{"imgSrc": ("/" + .name + ".png")})' tmp.json > output.json
2 个赞
Elijah
10
从vim过来的,所以我会用宏,1-2分钟吧,很快啊。如果用kakoune 的话就用multi-cursor。如果经常用就写个1-2行的脚本吧。
没有人用最普通的键盘宏吗 大概这样
<f3>
C-s "name": SPC RET C-M-k C-y
C-e C-f TAB "imgSrc": SPC C-y C-M-b C-f /
<f4>
然后多按几个 <f4>
很快啊
2 个赞
标题可以改一下,太含糊。
能用语法解析尽量用,比如在以下情况 jq 仍然表现良好:
[
{
"name": "八卦阵",
"type": "防具",
"effect": "每当你需要使用(或打出)一张【闪】时,你可以进行一次判定:若结果为红色,则视为你使用(或打出)了一张【闪】;若为黑色,则你仍可以从手牌里使用(或打出)。"
},
{
"type": "防具",
"name": "仁王盾",
"effect": "锁定技,黑色的【杀】对你无效。"
},
{
"type": "防御马",
"effect": "+1马",
"name": "的卢"
},
]
使用 elvish
cat a.json | from-json | each {|x| set x["imgSrc"] = "/"$x[name]".png"; put $x} (all) | put [(all)] | to-json