如果是你, 你怎么处理这个需求?

这不是求助, 只是想看看大家会怎么处理这个需求.

需求:

有 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

  1. 全选
  2. markmacro-secondary-region-set
  3. 移动光标到任意一个 name 的位置
  4. markmacro-mark-words
  5. C-e 移动到行尾
  6. 正常写 "imgSrc": "",
  7. markmacro-apply-all, 这样会在所有 name 下面都插入 imgSrc

只针对这个需求,我会使用正则替换

\("name": "\(.*\)",\)   =>  \1"imageSrc":"/\2.png",
4 个赞

我会告诉 gpt 现在的背景信息,然后让 chatgpt 推荐用什么实现以及怎么实现,然后再让他写个代码实现,然后再让他帮写一个测试脚本再造一些测试数据 :smiley:

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 个赞

从vim过来的,所以我会用宏,1-2分钟吧,很快啊。如果用kakoune 的话就用multi-cursor。如果经常用就写个1-2行的脚本吧。

如果是我,我提问之前先拟一个意义明确的标题。

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 个赞

不常用的话Emacs中用宏就够了

标题可以改一下,太含糊。

能用语法解析尽量用,比如在以下情况 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