• [技术干货] 基于C语言的json数据映射解析库CSON
    基于C语言的json数据映射解析库CSON基于C语言的json数据映射解析库CSON摘要:1:模型解析工具CSON2:打开KEIL,新建工程3:添加CSON文件到工程并编译4:具体实例应用4.1:声明结构体4.2:定义数据模型4.3:使用CSON来进行解析JSON格式摘要:在物联网通讯中,由于经常要跟网络服务数据通讯,在这个过程里面,必须理解JSON格式,JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。我们把数据JSON封装好之后去做,然后再上传,同时,我们通过上位机或者web进行下发控制的时候,也是以JSON格式来处理,下面讲下基于C语言的json数据映射解析库CSON。在STM32F1最小系统板上来实现处理。1:模型解析工具CSONcJSON,运行于C语言平台的json-struct的解析库,这个解析库在github上有开源,地址为:https://github.com/NevermindZZT/cson2:打开KEIL,新建工程3:添加CSON文件到工程并编译将github上下载的两个文件添加到keil工程里面。然后编译,查看编译结果。4:具体实例应用引用GIthub上作者原话, CSON是一个简单的cJSON的二次封装,相比于使用原生cJSON一层一层解析的方式,CSON采用模型映射的方式,使用模型将结构体的特征进行描述,然后根据模型,将json数据直接解析成结构体,免去使用原生cJSON需要多次调用API的复杂性,可以很大程度减少代码冗余,增加代码逻辑性。所以你会在工程里面看到CJSON文件,下面进行实际操作下。4.1:声明结构体4.2:定义数据模型4.3:使用CSON来进行解析JSON格式json格式示例:测试函数在函数调用之前,还需要进行初始化。查看串口调试助手信息:json格式已经解析,这个模块的功能还有很多,也可以编码结构体,将结构体对象序列化成json字符串,大家可以自己去实现处理。是不是很方便,大家可以具体去实现!
  • [技术干货] [studio 2.16] Studio中很多时候都会用到Json与Dict类型的转化
    主要用到 json.loads(str_json), json.load(f_read_json), json.dumps(dict),json.dump(f_write_dict)这四个函数。 1.函数:loads()是将str类型的json数据转化为dict类型的数据,load()是将json文件读出来的str类型的json数据转化为dict类型的数据,dumps()是将dict类型的数据转化为str类型的json数据,dump()是将dict类型的数据写入json文件当中。2.参数:Str_json :str类型的json数据,f_read_json:能json文件读出来的函数名命名,dict:dict类型的数据,f_write_dict:能在json文件写入的函数名命名。其中 f_read_json、f_write_dict :类似与如下的f:下图可更清晰看出其函数的作用:Demo.py Json_load.json:Json_dump.json:运行结果:
  • [赋能学习] 华为FusionInsight MRS FlinkSQL 复杂嵌套Json解析最佳实践
    # 华为FusionInsight MRS FlinkSQL 复杂嵌套Json解析最佳实践 ## 背景说明 随着流计算的发展,挑战不再仅限于数据量和计算量,业务变得越来越复杂,开发者可能是资深的大数据从业者、初学 Java 的爱好者,或是不懂代码的数据分析者。如何提高开发者的效率,降低流计算的门槛,对推广实时计算非常重要。 SQL 是数据处理中使用最广泛的语言,它允许用户简明扼要地展示其业务逻辑。Flink 作为流批一体的计算引擎,致力于提供一套 SQL 支持全部应用场景,Flink SQL 的实现也完全遵循 ANSI SQL 标准。之前,用户可能需要编写上百行业务代码,使用 SQL 后,可能只需要几行 SQL 就可以轻松搞定。 本文介绍如何使用华为FusionInsight MRS FlinkServer服务进行界面化的FlinkSQL编辑,从而处理复杂的嵌套Json格式 ## Json内容 下面以cdl新增数据的json为例 ``` { "schema":{ "type":"struct", "fields":[ { "type":"string", "optional":false, "field":"DATA_STORE" }, { "type":"string", "optional":false, "field":"SEG_OWNER" }, { "type":"string", "optional":false, "field":"TABLE_NAME" }, { "type":"int64", "optional":false, "name":"org.apache.kafka.connect.data.Timestamp", "version":1, "field":"TIMESTAMP" }, { "type":"string", "optional":false, "field":"OPERATION" }, { "type":"string", "optional":true, "field":"LOB_COLUMNS" }, { "type":"struct", "fields":[ { "type":"array", "items":{ "type":"struct", "fields":[ { "type":"string", "optional":false, "field":"name" }, { "type":"string", "optional":true, "field":"value" } ], "optional":false }, "optional":false, "field":"properties" } ], "optional":false, "name":"transaction", "field":"transaction" }, { "type":"struct", "fields":[ { "type":"int64", "optional":false, "field":"uid" } ], "optional":true, "name":"unique", "field":"unique" }, { "type":"struct", "fields":[ { "type":"int64", "optional":false, "field":"uid" }, { "type":"string", "optional":true, "default":"", "field":"uname" }, { "type":"int64", "optional":true, "field":"age" }, { "type":"string", "optional":true, "field":"sex" }, { "type":"string", "optional":true, "field":"mostlike" }, { "type":"string", "optional":true, "field":"lastview" }, { "type":"int64", "optional":true, "field":"totalcost" } ], "optional":true, "name":"data", "field":"data" }, { "type":"struct", "fields":[ ], "optional":true, "name":"EMPTY", "field":"before" }, { "type":"string", "optional":true, "field":"HEARTBEAT_IDENTIFIER" } ], "optional":false, "name":"hudi.hudisource" }, "payload":{ "DATA_STORE":"MYSQL", "SEG_OWNER":"hudi", "TABLE_NAME":"hudisource", "TIMESTAMP":1631070742000, "OPERATION":"INSERT", "LOB_COLUMNS":"", "transaction":{ "properties":[ { "name":"file", "value":"mysql-bin.000005" }, { "name":"pos", "value":"32307" }, { "name":"gtid", "value":"" } ] }, "unique":{ "uid":11 }, "data":{ "uid":11, "uname":"蒋语堂", "age":38, "sex":"女", "mostlike":"图", "lastview":"播放器", "totalcost":28732 }, "before":null, "HEARTBEAT_IDENTIFIER":"998d66cc-1405-40e2-bbdc-41f2adf40724" } } ``` 上面的数据信息为复杂的json嵌套结构,包含了 Map、Array、Row 等类型, 对于这样的复杂格式需要有一种高效的方式进行解析,下面介绍如何实现。 ## 华为FusionInsight MRS Flink WebUI介绍 Flink WebUI提供基于Web的可视化开发平台,用户只需要编写SQL即可开发作业,极大降低作业开发门槛。同时通过作业平台能力开放,支持业务人员自行编写SQL开发作业来快速应对需求,大大减少Flink作业开发工作量。 Flink WebUI主要有以下特点: - 企业级可视化运维:运维管理界面化、作业监控、作业开发Flink SQL标准化等。 - 快速建立集群连接:通过集群连接功能配置访问一个集群,需要客户端配置、用户认证密钥文件。 - 快速建立数据连接:通过数据连接功能配置访问一个组件。创建“数据连接类型”为“HDFS”类型时需创建集群连接,其他数据连接类型的“认证类型”为“KERBEROS”需创建集群连接,“认证类型”为“SIMPLE”不需创建集群连接。 - 可视化开发平台:支持自定义输入/输出映射表,满足不同输入来源、不同输出目标端的需求。 - 图形化作业管理:简单易用。 下面介绍如何使用Flink WebUI开发FlinkSQL DDL语句解析出有效信息 ### 操作步骤 - 登录华为FusionInisght MRS Flink WebUI ![20210908_115504_73.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/08/143304gewyk4tfntn0qbnv.png) - 在作业管理选择新建作业创建一个FlinkSQL任务 ![20210908_115556_96.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/08/143327rkmbxwdvkb9h3qpw.png) - 编辑Flink SQL语句 SQL说明:创建两张kafka流表,起作用为从kafka源端读取cdl对应topic,解析出需要的字段。并将结果写入另外一个kafka topic 1. Json 中的每个 {} 都需要用 Row 类型来表示 2. Json 中的每个 [] 都需要用 Arrary 类型来表示 3. 数组的下标是从 1 开始的不是 0 如下面 SQL 中的 \`schema\`.\`fields\`[1].type 4. 关键字在任何地方都需要加反引号 如上面 SQL 中的 \`type\` 5. select 语句中的字段类型和顺序一定要和结果表的字段类型和顺序保持一致 6. 可使用flink函数比如LOCALTIMESTAMP为获取flink系统时间 ![20210908_141252_72.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/08/143416bvvocyi0issczzbt.png) ``` CREATE TABLE huditableout_source( `schema` ROW `fields` ARRAY ROW> >, payload ROW `TIMESTAMP` BIGINT, `data` ROW uid INT, uname VARCHAR(32), age INT, sex VARCHAR(30), mostlike VARCHAR(30), lastview VARCHAR(30), totalcost INT> >, type1 as `schema`.`fields`[1].type, optional1 as `schema`.`fields`[1].optional, field1 as `schema`.`fields`[1].field, type2 as `schema`.`fields`[2].type, optional2 as `schema`.`fields`[2].optional, field2 as `schema`.`fields`[2].field, ts as payload.`TIMESTAMP`, uid as payload.`data`.uid, uname as payload.`data`.uname, age as payload.`data`.age, sex as payload.`data`.sex, mostlike as payload.`data`.mostlike, lastview as payload.`data`.lastview, totalcost as payload.`data`.totalcost, localts as LOCALTIMESTAMP ) WITH( 'connector' = 'kafka', 'topic' = 'huditableout', 'properties.bootstrap.servers' = '172.16.9.113:21007,172.16.9.117:21007,172.16.9.118:21007', 'properties.group.id' = 'example', 'scan.startup.mode' = 'latest-offset', 'format' = 'json', 'json.fail-on-missing-field' = 'false', 'json.ignore-parse-errors' = 'true', 'properties.sasl.kerberos.service.name' = 'kafka', 'properties.security.protocol' = 'SASL_PLAINTEXT', 'properties.kerberos.domain.name' = 'hadoop.hadoop.com' ); CREATE TABLE huditableout( type1 VARCHAR(32), optional1 BOOLEAN, field1 VARCHAR(32), type2 VARCHAR(32), optional2 BOOLEAN, field2 VARCHAR(32), ts BIGINT, uid INT, uname VARCHAR(32), age INT, sex VARCHAR(30), mostlike VARCHAR(30), lastview VARCHAR(30), totalcost INT, localts TIMESTAMP ) WITH( 'connector' = 'kafka', 'topic' = 'huditableout2', 'properties.bootstrap.servers' = '172.16.9.113:21007,172.16.9.117:21007,172.16.9.118:21007', 'properties.group.id' = 'example', 'scan.startup.mode' = 'latest-offset', 'format' = 'json', 'json.fail-on-missing-field' = 'false', 'json.ignore-parse-errors' = 'true', 'properties.sasl.kerberos.service.name' = 'kafka', 'properties.security.protocol' = 'SASL_PLAINTEXT', 'properties.kerberos.domain.name' = 'hadoop.hadoop.com' ); insert into huditableout select type1, optional1, field1, type2, optional2, field2, ts, uid, uname, age, sex, mostlike, lastview, totalcost, localts from huditableout_source; ``` - 点击语义校验,确保语义校验通过 ![20210908_142109_23.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/08/143441tzcttezpo9y9tc5i.png) - 启动该Flink SQL任务 ![20210908_142205_53.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/08/143503v7firh7gsfdvapen.png) - 检查结果 源端kafka 数据 ![20210908_142329_14.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/08/143526b6zmjpwltlow0xd3.png) 目标端kafka 数据 ![20210908_142409_93.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/08/143550svt7xujrsryihybu.png)
  • [技术干货] jackson使用@jsonserialize格式
    一、 问题最近开发中使用BigDecimal这个数据类型 返回json数据时出现了点问题:# 1.前端第一次保存的时候 穿过来的数据格式 240.00240.77# 2. mysql数据库存储的数据格式(数据库字段已经设置了保留小数点后两位)240240.77# 3. java程序中查看从数据库中查询的回来的数据格式:240.00240.77# 4. 返回前端的json字符串里的数据格式:240240.77# 4. 前端想要的json字符串里的数据格式:240.00240.77由上面的一系列分析可知:要想解决这个根源在于返回json数据的时候需要将数据格式化。二、解决方案:使用@JsonSerialize输出数据保留两位小数步骤1.创建一个BigDecimal格式化工具import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.databind.JsonSerializer;import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException;import java.math.BigDecimal;public class BigDecimalSerialize extends JsonSerializer<BigDecimal> {  @Override  public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {    if (value != null && !"".equals(value)) {      gen.writeString(value.setScale(2, BigDecimal.ROUND_HALF_DOWN) + "");    } else {      gen.writeString(value + "");    }  }}步骤二:在返回的实体类对应的属性上加上注解:@JsonSerialize(using = BigDecimalSerialize.class) private BigDecimal totalCost;总结这个方案可以统一解决json的Date日期类型,String类型。double类型。。。等等的序列化格式问题延伸:@JsonSerialize正确使用实际开发中,我们一定遇到过这样的问题:前端显示和后台存储数据单位不统一,而且各有各自的理由,统一不了,那就只能由后端转换。每次返回给前端时再转换一遍,返回给前端的json数据,在后端里定义的往往是一个对象,如何做到优雅的转换呢?只需两步操作:1. 写一个负责转换的类,里面写好规则public class MySerializerUtils extends JsonSerializer<Integer> {  @Override  public void serialize(Integer status, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {    String statusStr = "";     switch (status) {       case 0:         statusStr = "新建状态";         break;       case 1:        statusStr = "就绪状态";         break;       case 2:         statusStr = "运行状态";         break;       case 3:         statusStr = "阻塞和唤醒线程";         break;       case 4:        statusStr = " 死亡状态";        break;       default:         statusStr = "状态信息不符合";     }     jsonGenerator.writeString(statusStr);   } }2. 在实体类上需要装换的字段上加上注解/** * 多线程生命周期状态值 */@JsonSerialize(using = MySerializerUtils.class)private int status;注:@JsonSerialize注解,主要应用于数据转换,该注解作用在该属性的getter()方法上。
  • [推理经验] 使用Dump功能比对Ascend310和Ascend910推理过程中相同算子的输入和输出数据
    本文主要分享在Ascend310和Ascend910的推理过程使用Dump功能比对相同算子的输入和输出数据,帮助定位问题算子。一、使用该方法的前提条件和建议:1.训练好的模型在Ascend910上推理精度已达到预期要求;2.确保Ascend310上预处理图片结果是与Ascend910上处理结果是一致的;3.当满足上述两点时,开发Ascend310推理过程中若遇到Ascend310上的推理精度与Ascend910上的推理精度有较大偏差时可以尝试用该方法定位问题算子;4.建议使用一张相同的输入图片进行数据Dump。二、Ascend910上Dump图和数据:官网已给出训练过程中Dump功能操作流程:https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.3/dump_in_graph_mode.html?推理过程使用Dump功能大同小异,下面对操作步骤进行总结:1.使用静态图模式;2.使用同步dump时json文件设置方式,需要将trans_flag设置为false;{ "common_dump_settings": { "dump_mode": 0, "path": "/absolute_path", "net_name": "ResNet50", "iteration": 0, "input_output": 0, "kernels": ["Default/Conv-op12"], "support_device": [0,1,2,3,4,5,6,7] }, "e2e_dump_settings": { "enable": true, "trans_flag": false }}3.配置环境变量:export MINDSPORE_DUMP_CONFIG=/path/to/data_dump.json4.随后运行推理脚本即可,Dump的数据和图会被保存在json文件设置的路径当中。Dump生成的数据文件是后缀名为.bin的文件,可以使用numpy.fromfile命令查看具体数据,需要注意的是要根据文件名指定输出数据类型和shape。np.fromfile('Default--decode-DetectionDecode--gather_topk-GatherTopK--Mod-op1608_input_0_shape_1_80_100_Int32_DefaultFormat.bin', dtype=np.int32).reshape((1, 80, 100))对于图的两个文件,后缀名分别是.pb和.ir文件,.pb文件可以使用MindInsight查看,.ir可以使用vi命令查看。三、Ascend310上Dump图和数据:dump的图和数据可在全部配置完成后再运行推理脚本一起生成。Dump图:1.设置以下环境变量后重新运行推理脚本即可,需要将之前编译的c++文件删除,此外商用版本不具备此功能:export DUMP_GE_GRAPH=22.运行推理脚本后,Dump下来的图会被保存在运行路径中,后缀名为.pbtxt文件,可安装netron包后使用如下命令查看,通常查看'ge_onnx_00000070_graph_0_Build.pbtxt'文件即可:netron.start('ge_onnx_00000070_graph_0_Build.pbtxt')Dump数据:1.获取Mindir文件的图名,获取方式如下:from mindspore.train._utils import read_protomodel = read_proto("mindir_path")with open('mindir.log', 'w+') as f: f.write(str(model))生成mindir.log文件后使用如下命令:grep -rn "name:" mindir.log |grep ":  name"输出类似图名:"4855_2425_1_construct_wrapper.101"图名一定要正确,否则无法成功dump数据。2.设置如下acl.json文件,注意json文件中的模型名需要在最后增加.0:{ "dump":{ "dump_list":[ { "model_name":"4855_2425_1_construct_wrapper.101.0" } ], "dump_path":"/absolute_path", "dump_mode":"all" }}3.修改main.cc文件:#include "acl/acl.h"aclInit("acl.json的绝对地址");  //加在main函数中如输入数据类型为fp32还需要在main.cc文件添加以下语句:ascend310->SetBufferOptimizeMode("off_optimize"); ascend310->SetPrecisionMode("allow_fp32_to_fp16");ascend310->SetOpSelectImplMode("high_precision");4.在CMakeList.txt文件添加如下语句:include_directories(/usr/local/Ascend/fwkacllib/include/                    ../inc)target_link_libraries(main ${MS_LIB} ${MD_LIB} ascendcl acl_dvpp acl_cblas gflags)5.运行推理脚本前,需要提前创建好json文件中设置的保存dump数据的文件夹。6.运行推理脚本后需要对dump下来的数据进行解析:首先需要找到run包中提供的msaccucmp.py文件,在根目录下使用如下命令:find ${run_path} -name "msaccucmp.py"找到后使用如下命令进行解析:python ${The absolute path of msaccucmp.py} convert -d {file path of dump} -out {file path of output}解析的文件保存格式为.npy文件,可以使用numpy.load命令直接查看,不需要像910中设置数据类型和shape。该过程在https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.3/dump_in_graph_mode.html?中的异步Dump数据分析样例中有详细描述。四、Dump数据比对技巧:1.根据生成的图找到对应算子所dump下来的输入和输出数据;2.由于网络模型通常会比较大,可以采用区间查看的方法,找到Ascend310和Ascend910中第一次出现算子输入相同输出不同的算子。五、其他注意事项:1.310中conv2d算子不支持fp16,所以如果输入数据类型为fp32会前插cast将数据转为fp16,运算结束后再转回fp32;2.Exp算子的输出范围为fp16,所以nn.Sigmoid算子输出张量会出现大量相同输出数据,不会影响推理结果;3.目前ops.Mod算子在输入数据相同的情况下,在310和910上输出数据会有偏差,可用ops.FloorMod算子替代。
  • [实践系列] GaussDB(DWS)实践系列-函数实现JSON类型解析
    GaussDB(DWS)实践-函数实现JSON类型解析       在项目交付中会遇到针对JSON类型解析的场景,例如key值获取value,当前GaussDB(DWS)不支持(需求已规划),针对该场景可参考本文方法实现,实际使用过程中可按照注释内容按需调整。 函数定义:DROP FUNCTION IF EXISTS public.jsonpars;CREATE OR REPLACE FUNCTION public.jsonpars( p_str IN TEXT,key_name IN TEXT )RETURN TEXTIMMUTABLEASDECLARE    p_str_tmp TEXT := '' ; --定义TEXT类型变量:p_str_tmp,缓存读取的json文件去除'['和']'字符    len_p_str_tmp_1 INTEGER := 0 ; --定义INTEGER类型变量:len_p_str_tmp_1,缓存读取的json文件的长度    str_tmp_1 TEXT ; --定义TEXT类型变量:str_tmp_1,缓存读取的json文件replace之后的内容    len_p_str_tmp_2 INTEGER := 0 ; --定义INTEGER类型变量:len_p_str_tmp_2,缓存读取的replace后的json文件的长度    comma_position INTEGER := 0 ; --定义INTEGER类型变量:comma_position,缓存逗号在选定文本字符串中位置    symbol_position INTEGER := 1 ; --定义INTEGER类型变量:symbol_position,缓存指定字符开始匹配起始位置    lbrace_position INTEGER := 0 ; --定义INTEGER类型变量:lbrace_position,缓存左大括号在选定文本字符串中位置    rbrace_position INTEGER := 0 ; --定义INTEGER类型变量:rbrace_position,缓存右大括号在选定文本字符串中位置    str_tmp_key_value TEXT := '' ; --定义TEXT类型变量:str_tmp_key_value,缓存解析出的"key":"value"单一值    TYPE ARRSTR IS VARRAY(1024) OF TEXT ; --定义TEXT类型数组类型:ARRSTR    array_value ARRSTR := ARRSTR() ; --定义ARRSTR类型的数组:array_value,缓存解析出的"key":"value"的所有值    array_cnt INTEGER := 1 ; --定义INTEGER类型变量:array_cnt,缓存数组下标变量值,初始值为1,(GaussDB 200的数组下标值从1开始)    lbrace_ajust_num INTEGER := 0 ; --定义INTEGER类型变量:lbrace_ajust_num,缓存左大括号在选定文本字符串中个数    rbrace_ajust_num INTEGER := 0 ; --定义INTEGER类型变量:rbrace_ajust_num,缓存右大括号在选定文本字符串中个数    change_position INTEGER := 0 ; --定义INTEGER类型变量:change_position,缓存指定读取右括号次数    array_loop_cnt INTEGER := 1 ; --定义INTEGER类型变量:array_loop_cnt,缓存读取数组下标值    colon_position INTEGER := 0 ; --定义INTEGER类型变量:colon_position,缓存"key":"value"值中的:所在位置    array_key_value TEXT := '' ; --定义TEXT类型变量:array_key_value,缓存从数组中取出的key值    array_value_value TEXT := '' ; --定义TEXT类型变量:array_value_value,缓存从数组中取出的value值    return_value TEXT := '' ; --定义TEXT类型变量:return_value,缓存返回值BEGIN    p_str_tmp := replace( replace( cast( p_str as TEXT ) , '[{' , '{' ) , '}]' , '}' ) ;    len_p_str_tmp_1 := LENGTH( p_str_tmp ) ;    str_tmp_1 := SUBSTR( p_str_tmp , 2 , ( len_p_str_tmp_1 - 2 ) ) ;    len_p_str_tmp_2 := LENGTH( str_tmp_1 ) ;    IF ( len_p_str_tmp_2 > 0 ) THEN        WHILE ( comma_position < len_p_str_tmp_2 ) LOOP            comma_position := INSTR( str_tmp_1 , ',' , symbol_position ) ;            lbrace_position := INSTR( str_tmp_1 , '{' , symbol_position ) ;            rbrace_position := INSTR( str_tmp_1 , '}' , symbol_position ) ;            IF ( comma_position = 0 ) THEN                comma_position := len_p_str_tmp_2 ;                str_tmp_key_value := substr( str_tmp_1 , symbol_position , ( len_p_str_tmp_2 - symbol_position + 1 ) ) ;                array_value.EXTEND ;                array_value( array_cnt ) := str_tmp_key_value ;                EXIT ;            ELSIF ( ( lbrace_position > 0 ) AND ( lbrace_position < comma_position ) AND ( comma_position < rbrace_position ) ) THEN                SELECT ( LENGTH( SUBSTR( str_tmp_1 , symbol_position , ( rbrace_position - symbol_position + 1 ) ) ) - LENGTH( REPLACE( SUBSTR( str_tmp_1 , symbol_position , ( rbrace_position - symbol_position + 1 ) ) , '{' , '' ) ) ) INTO lbrace_ajust_num ;                SELECT ( LENGTH( SUBSTR( str_tmp_1 , symbol_position , ( rbrace_position - symbol_position + 1 ) ) ) - LENGTH( REPLACE( SUBSTR( str_tmp_1 , symbol_position , ( rbrace_position - symbol_position + 1 ) ) , '}' , '' ) ) ) INTO rbrace_ajust_num ;                WHILE ( lbrace_ajust_num <> rbrace_ajust_num ) LOOP                    change_position := ( change_position + 1 ) ;                    rbrace_position := INSTR( str_tmp_1 , '}' , symbol_position , change_position ) ;                    SELECT ( LENGTH( SUBSTR( str_tmp_1 , symbol_position , ( rbrace_position - symbol_position + 1 ) ) ) - LENGTH( REPLACE( SUBSTR( str_tmp_1 , symbol_position , ( rbrace_position - symbol_position + 1 ) ) , '{' , '' ) ) ) INTO lbrace_ajust_num ;                    SELECT ( LENGTH( SUBSTR( str_tmp_1 , symbol_position , ( rbrace_position - symbol_position + 1 ) ) ) - LENGTH( REPLACE( SUBSTR( str_tmp_1 , symbol_position , ( rbrace_position - symbol_position + 1 ) ) , '}' , '' ) ) ) INTO rbrace_ajust_num ;                END LOOP ;                change_position := 0 ;                str_tmp_key_value := SUBSTR( str_tmp_1 , symbol_position , ( rbrace_position - symbol_position + 1 ) ) ;                symbol_position := ( rbrace_position + 2 ) ;                array_value.EXTEND ;                array_value( array_cnt ) := str_tmp_key_value ;                array_cnt := ( array_cnt + 1 ) ;            ELSE                str_tmp_key_value := SUBSTR( str_tmp_1 , symbol_position , ( comma_position - symbol_position ) ) ;                symbol_position := ( comma_position + 1 ) ;                array_value.EXTEND ;                array_value( array_cnt ) := str_tmp_key_value ;                array_cnt := ( array_cnt + 1 ) ;            END IF ;        END LOOP ;        FOR array_loop_cnt IN 1..array_value.count LOOP            colon_position := 0 ;            array_key_value := '' ;            array_value_value := '' ;            str_tmp_key_value := btrim( array_value( array_loop_cnt ) ) ; --去除开头和结尾的空格            colon_position := INSTR( str_tmp_key_value , TO_CHAR( ':' ), 1 , 1 ) ;            array_key_value := btrim( SUBSTR( str_tmp_key_value , 1 , ( colon_position - 1 ) ) ) ;            array_value_value := btrim( SUBSTR( str_tmp_key_value , ( colon_position + 1 ), LENGTH( str_tmp_key_value ) ) ) ;            IF( array_key_value = ( '"' || key_name || '"' ) ) THEN                return_value := array_value_value ;                RETURN return_value ;            END IF ;        END LOOP ;           END IF ;    RETURN return_value ;END ;/  测试用例:【用例1】select jsonpars('{"a":"info_a","b":{"c":"info_c","d":"info_d"}}','a');【用例2】select jsonpars('{"a":"info_a","b":{"c":"info_c","d":"info_d"}}','b'); 【用例3】select jsonpars(jsonpars('{"a":"info_a","b":{"c":"info_c","d":"info_d"}}','b'),'d'); 【用例4】select jsonpars(jsonpars('{"a":"info_a","b":{"c1":"info_c","c2":{"d1":"info_d1","d2":"info_d2"},"d":"info_d"}}','b'),'d'); 
  • [软件平台] 修改canbus_config.json文件下发失败
    【功能模块】【操作步骤&问题现象】1、最开始下发过canfdbus的json文件,通过命令export CM_CONFIG_FILE_PATH=/home/mdc/opt/etc/mcu_control_tool/cd /home/mdc/opt/bin/mcu_control_tool./mcu_control_tool set-devmgr清除canfd的配置表2、修改完canbus_config.json文件,将mdc/home/conf里面的canbus_config.json文件 使用rm命令删除掉,在将修改过的json文件上传,在使用下发命令,下发失败。[注:canbus_config.json文件没有经过mmc得到,是直接修改,附件上传修改过的json文件,修改地方为channleid2]3、最后按照同样的步骤下发,没有修改过的canbus_config.json文件,显示下发成功4.猜测是否是更改后格式问题,因为我尝试过使用json编辑网站,编辑过json文件,下发也是失败。【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 关于IOC出现导入配盘表,JSON等文件导入失败的情况,请协助处理
    【功能模块】现在我们使用如下生产环境的账号进入IOC平台,出现了导入配盘表,JSON等文件导入失败的情况(详见截图)用如下账号:IOC平台:账号:bdl01密码:*******https://studio.e.huawei.com/magno/render/SmartCampus__SystemManagement_0000000000iNytgNvIMz/LoginIOTDA平台https://www.huaweicloud.com/product/iothub.html账号:xh-iot   iot-bdl  密码:*******沃土平台:https://developer.e.huawei.com/账号:Hi-Dev001密码:*******请帮忙查看是否是以上生产环境的账号的权限未开通导致的问题,因为用如下测试账号则不会存在如下问题IOC平台:https://appcuberun.cn-north-4.huaweicloud.com/magno/render/SmartCampus__SystemManagement_0000000000jVie6z0nHE账号:xinghaiadmin   密码:*******IOTDA平台:账号:hwstaff_ngba03xinghai02密码:*******备注:注册电话:19926555651地址:https://appcuberun.cn-north-4.huaweicloud.com/https://console.huaweicloud.com/iotdm沃土平台:https://developer.e.huawei.com/账号:Hi-xh246  密码:*******【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] Mobaxterm怎么找不到bundle.json
    Code目录下有bundle.json但是这里却显示找不到 538180
  • [页面编排] ADC 2.0 U.getUrlParameters()获取JSON对象转成了无法解析的字符串
    【功能模块】【操作步骤&问题现象】1、使用 NfLayout.openTab("/app/spl/SMAP_page_framework/smap_border_layout_page.spl",{"target":"_tab"},contextParam); 方法打开新页签,传递参数如下,使用U.getUrlParameters()解析时,将nodeInfo转换为"[object object]"导致解析失败,页面报错var drawTopoParam = {asset_type: "nfv_topo_asset",showTree: false,nodeInfo: {category: "nfv_topo_asset",name: "nfv_vnf_network",linkedTopoId: "/topology/layer[1]/node[1]/network",nodes: [{"resId": "5046ITQVPG2Y7SALF1ODUBW0KR586","deviceType": "NFV_VNF","linkedTopoId": "/topology/layer[1]/node[1]/network"}],filters: []}}2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [页面编排] ADC 2.0 U.getUrlParameters()获取JSON对象转成了无法解析的字符
    使用 NfLayout.openTab("/app/spl/SMAP_page_framework/smap_border_layout_page.spl",{"target":"_tab"},contextParam); 方法打开新页签,传递参数如下,使用U.getUrlParameters()解析时,将nodeInfo转换为"[object object]"导致解析失败,页面报错var drawTopoParam = {asset_type: "nfv_topo_asset",showTree: false,nodeInfo: {category: "nfv_topo_asset",name: "nfv_vnf_network",linkedTopoId: "/topology/layer[1]/node[1]/network",nodes: [{"resId": "5046ITQVPG2Y7SALF1ODUBW0KR586","deviceType": "NFV_VNF","linkedTopoId": "/topology/layer[1]/node[1]/network"}],filters: []}}
  • [API集成编排] ADC2.0上传工程gdk文件结构是什么?
    1、把gdk里面的procode文件删除的只剩dist文件,导入是报错的说是没有adcui.json和package.json文件2、将adcui.json和package.json放在和dist同级目录,导入成功3、将adcui.json和package.json放在dist的一级子目录里面。导入报错。找不到adcui.json和package.json问题:ADC 2.0对上传工程包结构是什么?
  • [技术干货] cfssl安装与使用简介
    cfssl是一个开源的证书管理工具,使用json文件生成证书。首先下载软件包:wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64网站会转到github上,所以有概率的通,多试几次,或者在不同的时间尝试就可以了。chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64mv cfssl_linux-amd64 /usr/local/bin/cfsslmv cfssljson_linux-amd64 /usr/local/bin/cfssljsonmv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo新建工作目录:root@ecs-385f:~# mkdir -p ~/TLS/{etcd,k8s}root@ecs-385f:~# root@ecs-385f:~# cd TLS/etcd编写json文件。root@ecs-385f:~/TLS/etcd# cat > ca-config.json << EOF> {>   "signing": {>     "default": {>       "expiry": "87600h">     },>     "profiles": {>       "www": {>          "expiry": "87600h",>          "usages": [>             "signing",>             "key encipherment",>             "server auth",>             "client auth">         ]>       }>     }>   }> }> EOFroot@ecs-385f:~/TLS/etcd# cat > ca-csr.json << EOF> {>     "CN": "etcd CA",>     "key": {>         "algo": "rsa",>         "size": 2048>     },>     "names": [>         {>             "C": "CN",>             "L": "Beijing",>             "ST": "Beijing">         }>     ]> }> EOFroot@ecs-385f:~/TLS/etcd# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -2021/07/20 15:58:11 [INFO] generating a new CA key and certificate from CSR2021/07/20 15:58:11 [INFO] generate received request2021/07/20 15:58:11 [INFO] received CSR2021/07/20 15:58:11 [INFO] generating key: rsa-20482021/07/20 15:58:11 [INFO] encoded CSR2021/07/20 15:58:11 [INFO] signed certificate with serial number 59276862610630986285733853175071420396604894705root@ecs-385f:~/TLS/etcd# ls *pemca-key.pem  ca.pemroot@ecs-385f:~/TLS/etcd# 
  • [数据编排] 轻量化ETL 转换算子对json数据怎么处理?
    BDI|PI_3582|Execute task's expression error : There is an expression error in the field 'DATA_TIME' of stage H013,  the expression is: JSON_EXTRACT(UPSTREAM_SYSTEM_INFO, "$.DATA_TIME"), Expression compile failed : JSON_EXTRACT(UPSTREAM_SYSTEM_INFO, "$.DATA_TIME")com.huawei.data.integration.common.DSException: There is an expression error in the field 'DATA_TIME' of stage H013,  the expression is: JSON_EXTRACT(UPSTREAM_SYSTEM_INFO, "$.DATA_TIME"), Expression compile failed : JSON_EXTRACT(UPSTREAM_SYSTEM_INFO, "$.DATA_TIME")
  • [问题求助] 逻辑流如何将xml格式参数转换成json格式?
    【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)