扩展新NPC命令写法:
添加NPC命令JSON,操作JSON的字符串,格式:JSON 标识|存活时间 子命令 名称
数值
!可以使用VSCode(安装json扩展插件,json格式化插件)查看编辑json文件。
!资料参考:https://www.runoob.com/json/json-tutorial.html
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
各个参数意义:
1)
标识,类似自由变量,指定一个唯一标识,“|”号后面是此对象的存活时间(秒),-1表示永久,
不写存活时间默认是180秒,即180秒后,此标识的JSON对象会被释放。
2) 子命令,有以下几种:
InitJsonFromFile 文件名
//从Json文件初始化
SaveToJsonFile
文件名 //保存到Json文件
InitJson
Json字符串 //从给定的Json字符串初始化
InitFrom
其他标识.路径 //从其他标识.路径下的Json初始化,相当于复制,“.路径”可选
InitArrayFromCsv
Csv字符串 //从给定的Json数字字符串初始化为Json数组
InitArrayFromCsvFile 文件名 //从给定的Csv文件初始化为Json数组
ToCsv
S变量
//保存Csv字符串到S变量中,只能是数组对象才能保存为Csv字符串
SaveToCsvFile
文件名
//保存到Csv文件,只能是数组对象才能保存为Csv文件
SortByName
//按名称排序
SortByValue
//按数值排序
Clear //清理
DeleteByName
名称 //按名称删除
DeleteByPath
路径
//按路径删除
AddValue 名称
数值
//添加数值,数值可以是普通的字符串、整数、浮点数等,或者是一个标准的Json对象或数字(字符串形式)
AddOrUpdateValue 名称
数值 //添加或更新数值(存在则更新,否则添加),其他同上
SetValueByPath 路径 数值
//按路径设置数值(不存在则创建,否则更新)
AddOrUpdateObject 源标识
0/1 //从其源标识添加或更新到目标标识(参数2)的Json中,0只添加目标标识不存在的项,1目标标识里存在则会更新该项
GetCountByPath M变量
路径
//获取节点数量,当路径为空时,获取标识下的json的基层节点数到M变量,否则获取路径下对象或数组的节点数到M变量
3) 名称,类型是字符串
4)
数值,有以下几种类型:
整数 12345678
字符串 普通字符串
布尔值 True|False
浮点数 1.367
日期时间 "2018-11-12
06:12:11" 或
"2018-11-12T06:12:11.123",“.”后面指的是毫秒
数组 ["string",100,null,true,false,123.4]
对象 {"name":"ObjectName","value":"ObjectValue"}
注意:数值最好不要有空格,如果必须带空格,请使用双引号""包围起来以表示为1个参数
5)
JSON专用变量:
<$JSON(标识.路径)J>
//可读性差的单行JSON字符串,“.路径”为可选项,下同
<$JSON(标识.路径)H>
//格式化后的可读性高的多行JSON字符串
<$JSON(标识.路径)C>
//获取路径下对象或数组的数量
<$JSON(标识.路径)T.路径>
//获取类型,0未定义,1对象,2数组
<$JSON(标识.路径)N.索引>
//根据索引位置获取名称,索引依据上面获取的数量循环读取即可,索引是数字
<$JSON(标识.路径)V.名称或索引> //
根据索引位置或节点名称取值,有2种方法:1根据索引位置取值;2省略索引,直接用路径取值
例:
#act
JSON myjson Clear
JSON myjson AddValue 整数
12345
JSON myjson AddValue 字符串 这是字符串...
JSON myjson AddValue 布尔值
True
JSON myjson AddValue 浮点数 2.532
JSON myjson SetValueByPath 日期
"2018-11-12 06:12:11"
JSON myjson SetValueByPath 数组
["字符串",100,null,true,false,123.4]
JSON myjson SetValueByPath 对象
{"name":"Object_Name","value":"Object_Value"}
sendmsg 7
Json:<$JSON(myjson)H>
;
第一个位置以0开始,<$JSON(myjson.数组.1)V>等同于<$JSON(myjson.数组)V.1>
sendmsg 7
“数组”第2位置的值是:<$JSON(myjson.数组.1)V>
; 保存到文件
JSON myjson SaveToJsonFile
..\JsonData\example.json
; 从字符串解释到JSON
JSON myjson InitJson
{"myobj":{"name":"object1","subobj":{"name2":"subObj2","name1":"subObj1","int2":123456},"array":[1,3,4]},"array":[1.23,200,300,{"name":"字符串"}]}
sendmsg
7 取值:<$JSON(myjson.object.subobj.int2)V>
JSON myjson DeleteByPath array.3
JSON myjson
DeleteByPath myobj.subobj.1
JSON myjson DeleteByPath
myobj.subobj.int2
sendmsg 7 删除后的结果<$JSON(myjson)J>
; 合并例子
JSON dst InitJson {a:10000,b:200,c:"id"}
JSON
src InitJson {a:"str",d:500,e:7002}
; 只添加不存在的项目
JSON tmp InitFrom
dst
JSON tmp AddOrUpdateObject src 0
sendmsg 7
合并结果0:<$JSON(tmp)JSON>
; 不重复,重复项目将以“源标识”为准
JSON tmp InitFrom
dst
JSON tmp AddOrUpdateObject src 1
sendmsg 7
合并结果1:<$JSON(tmp)JSON>
; 赋值
JSON myjson SetValueByPath object.赋值.int
87654321
JSON myjson SetValueByPath object.赋值.float 5.76
JSON myjson
SetValueByPath object.赋值.string abcdefg...
JSON myjson SetValueByPath
object.赋值.datetime "2022-11-22 11:22:33.123"
JSON myjson SetValueByPath
object.赋值.子对象.int 12345678
JSON myjson SetValueByPath object.赋值.子对象.ishum
true
JSON myjson SetValueByPath object.赋值.子对象.float 5.76
JSON myjson
SetValueByPath object.赋值.子对象.array
[12345,1.76,false,string,2022-11-22T11:22:33.123]
sendmsg 7
赋值结果<$JSON(myjson)J>
; 其他测试例子
JSON myjson Clear
JSON myjson SetValueByPath
数组 ["字符串",100,null,true,123.4]
JSON myjson SetValueByPath 对象
{"name":"Object_Name","value":"Object_Value"}
sendmsg 7
重设结果:<$JSON(myjson)J>
; 根据索引循环取数组的值
Mov D98
<$JSON(myjson.数组)C>
sendmsg 7
类型值:<$JSON(myjson.数组)T>,数量:<$STR(D98)>
#for (D99 = 0, D99 <
D98, D99 + 1)
#if
#act
sendmsg 7
“数组[<$STR(D99)>]”的值:<$JSON(myjson.数组)V.<$STR(D99)>>
#~for
; 根据索引循环取对象里的值
Mov D98
<$JSON(myjson.对象)C>
sendmsg 7
类型值:<$JSON(myjson.对象)T>,数量:<$STR(D98)>
#for (D99 = 0, D99 <
D98, D99 + 1)
#if
#act
; 根据索引取得名称
Mov
S99 <$JSON(myjson.对象)N.<$STR(D99)>>
; 再根据名称取值
sendmsg 7
“对象”<$STR(S99)>的值是:<$JSON(myjson.对象)V.<$STR(S99)>>
#~for
; 另一种写法
; 将“myjson.对象”初始化到tmp中
JSON tmp InitFrom
myjson.对象 // 等同于 JSON tmp InitJson <$JSON(myjson.对象)V>
Mov D98 <$JSON(tmp)C>
sendmsg 7
类型值:<$JSON(tmp)T>,数量:<$STR(D98)>
#for (D99 = 0, D99 < D98, D99
+ 1)
#if
#act
; 取节点称
Mov S99
<$JSON(tmp)N.<$STR(D99)>>
;
不同于上面的索引位置取值,这里使用的是路径取值的方法
sendmsg 7
“对象”的值是:<$JSON(tmp.<$STR(S99)>)V>
#~for
添加NPC检测命令CheckJson,格式:CheckJson 标识 子命令 标识/名称/路径
选项
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
各个参数意义:
1)
标识,类似自由变量,指定一个唯一标识
2) 方法,有以下几种:
X 判断是否包含指定路径的子结点 //
用法:CheckJson myjson X path
N 判断当前层是否有指定的名称 // 用法:CheckJson myjson
N name
V 判断当前层是否有指定的数值 // 用法:CheckJson myjson V value
E
判断JSON内容是否相同 // 用法:CheckJson myjson E myjson2
例:
#if
true
#act
JSON myjson1 P
{"myobj":{"name":"object1","subobj":{"name2":"subObj2","name1":"subObj1","int2":123456},"array":[1,3,4]},"array":[1.23,200,300,{"str":"字符串"}]}
JSON
myjson2 P
{"myobj":{"name":"object1","subobj":{"name2":"subObj2","name1":"subObj1","int2":888888},"array":[1,3,4]},"array":[1.23,200,300,{"str":"字符串"}]}
#if
CheckJson myjson1 X
myobj.subobj.int2
#act
sendmsg 6
路径存在:<$JSON(myjson1)myobj.subobj.int2>
#elseact
sendmsg 5 路径不存在
#if
; 检测第一层,名为array的数组的第四个对象是否存在
CheckJson myjson1
X array
#act
sendmsg 6
路径存在,数组[0]:<$JSON(myjson1)array.0>,数组[3]整个对象:<$JSON(myjson1)array.3>,数组[3](是一个对象)“str”的值:<$JSON(myjson1)array.3.str>
#elseact
sendmsg
5 路径不存在
#if
CheckJson myjson1 N name2
#act
sendmsg 6
1)包含名称
#elseact
sendmsg 5 1)不包含名称
#if
CheckJson myjson1 V 123456
#act
sendmsg 6
3)包含数值
#elseact
sendmsg 5 3)不包含数值
#if
CheckJson myjson1 E myjson2
#act
sendmsg 6
5)相等
#elseact
sendmsg 5
5)不等