Previous topicNext topic
Help > BLUE引擎2021更新 >
新增高效率JSON命令

扩展新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)不等