Minecraft(我的世界)中文论坛

标题: 【CBL|SPG】[1.15+] JSON 文本中的 interpret [打印本页]

作者: SPGoding    时间: 2019-10-21 00:36
标题: 【CBL|SPG】[1.15+] JSON 文本中的 interpret


JSON 文本中有一个属性叫做 interpret,翻译一下可以知道它的意思是「解析」。该属性必须和 nbt 同时使用,否则没有效果。

简单来讲,当 interpret 被设置为 true 时,实际显示出来的文本会是原先文本被按照 JSON 文本的格式解析后的文本。

举个例子吧。我们往 data storage 里先写这么一个标签:

  1. /data merge storage test {spg: '["测试", "啊啊"]'}
复制代码

然后写这样的一个 JSON 文本:

  1. {"nbt": "spg", "storage": "test"}
复制代码

把它放到 tellraw 或者什么地方里,稍有常识的人都可以预测出它的结果:

  1. ["测试", "啊啊"]
复制代码

那么,如果在 JSON 文本中加上 interpret

  1. {"nbt": "spg", "storage": "test", "interpret": true}
复制代码

结果变为了:

  1. 测试啊啊
复制代码

可以看出,原先的 ["测试", "啊啊"] 被按照 JSON 文本的格式解析为了 测试啊啊



这个特性确实有用武之地。例如:

  1. /execute as @a run tellraw @s {"nbt": "SelectedItem.tag.display.Name", "entity": "@s", "interpret": true}
复制代码

这条命令就可以在聊天栏输出玩家手中握着的武器的自定义名称了(如果有的话)



没错,没什么用。



然而,并不只有 NBT 字符串里能储存像 JSON 文本一样的东西。

我们往 data storage 里再写这么一个标签:

  1. /data merge storage test {spg: ["测试", "啊啊"]}
复制代码

如果你没发现的话,这条命令的 spg 和刚才唯一的区别是删掉了最外层的单引号,使它从一个字符串标签变为了一个装有字符串的列表。

然后写这样的一个 JSON 文本:

  1. {"nbt": "spg", "storage": "test"}
复制代码

它的结果和刚刚一模一样:

  1. ["测试", "啊啊"]
复制代码

聪明的人已经能够想到,如果加上 interpret 的话:

  1. {"nbt": "spg", "storage": "test", "interpret": true}
复制代码

结果仍然是:

  1. 测试啊啊
复制代码

哇!

这成功实现了将多个字符串拼接到一起。事实上,不止字符串能够被拼接,NBT 中的 Int 标签也能够被视作为合法的 JSON 格式。因此,我们还可以将由 Int 标签组成的列表标签拼接为一个字符串,这在原版模组大数运算中有所体现。

相信你已经发现了,这一技巧仍然没有什么用处。

TAG_End

[groupid=546]Command Block Logic[/groupid]
作者: 雪颜の顾    时间: 2019-10-21 01:43
沙发QWQ
就是说原来输出SelectedItem.tag.display.Name这个NBT,是完整的把json文本输出出来了,如果加上interpret之后,就只会输出它的名字?
没用过json文本中的nbt
作者: rygtx    时间: 2019-10-21 03:49
66666666666666666666
作者: 不负韶华    时间: 2019-10-21 05:40
现在还没有1.15正式版,现在发是不是为时过早?
作者: Jokey_钥匙    时间: 2019-10-21 06:26
十分有用 比方说你要输出一堆动态文本时 可以不用反向空格了(
(然而如果能够读取json为list……)

作者: ruhuasiyu    时间: 2019-10-21 08:27
讲一讲告示牌技巧
作者: liach    时间: 2019-10-21 10:22
Mojang真应该在指令中添加内置nbt转json,这样如果能用data指令改text大家不还笑死
真心这就一行代码解决的事情(因为有datafixerupper)
  1. new Dynamic<>(NbtOps.INSTANCE, input).convert(JsonOps.INSTANCE).getValue()
复制代码


作者: 凌空的猫    时间: 2019-10-21 20:19
应该可以组织一些简单的句子吧,比如搞出个 “狂暴的喵刀”[tr乱入],还可以做一些简单的字符编辑
作者: chyx    时间: 2019-11-28 13:32
如果["测试", "啊啊"]里的两个字符串里有双引号的话,就不行了。。。
除非这个字符串里的第一个引号是单的。。。

似乎是因为如果里面的第一个引号是双引号的话,这个字符串在显示的时候会用单引号包裹,which 不被json认。。。。。





欢迎光临 Minecraft(我的世界)中文论坛 (https://www.mcbbs.net/) Powered by Discuz! X3.5