如何使用YAJL RPGLE解析含值数组的JSON键
解析RPGLE YAJL中的纯值数组
嘿,我之前在RPGLE里用YAJL处理JSON的时候也碰到过这个问题!你之前写的是解析对象数组(也就是数组里每个元素都是{"k1": "value1"}这种嵌套对象),而现在要处理的是纯值数组(数组元素直接是字符串、数字这类基础值),其实逻辑差不多,只是不需要再去每个数组节点里找子对象的键了——因为数组里的每个元素本身就是你要的目标值。
直接给你改好的代码示例,你可以参考:
dcl-s docNode pointer; dcl-s list pointer; dcl-s i int(10); dcl-s arrayElem pointer; dcl-s valueStr varchar(100); dcl-s valueNum packed(15:5); // 假设你已经完成JSON的初始解析,成功获取到根节点docNode list = YAJL_object_find(docNode: 'key'); i = 0; // 遍历纯值数组的核心循环 dow YAJL_ARRAY_LOOP( list: i: arrayElem ); // 建议先判断元素类型,避免类型不匹配导致的报错 select; when YAJL_get_type(arrayElem) = YAJL_STRING; valueStr = yajl_get_string(arrayElem); // 这里可以根据业务需求处理字符串值,比如存入数组变量或输出 dsply ('第' + %char(i+1) + '个元素:' + valueStr); when YAJL_get_type(arrayElem) = YAJL_NUMBER; valueNum = yajl_get_number(arrayElem); dsply ('第' + %char(i+1) + '个元素:' + %char(valueNum)); // 如果需要处理布尔、null等类型,可以继续添加分支 when YAJL_get_type(arrayElem) = YAJL_TRUE; dsply ('第' + %char(i+1) + '个元素:TRUE'); when YAJL_get_type(arrayElem) = YAJL_FALSE; dsply ('第' + %char(i+1) + '个元素:FALSE'); when YAJL_get_type(arrayElem) = YAJL_NULL; dsply ('第' + %char(i+1) + '个元素:NULL'); other; dsply ('第' + %char(i+1) + '个元素:不支持的类型'); endsl; enddo;
关键区别说明:
- 你之前的代码里,
node是数组里的对象节点,所以需要用YAJL_object_find(node: 'k1')去取对象里的键值;而现在的arrayElem直接就是数组中的值节点,不需要再嵌套查找。 - 加上类型判断是个好习惯,尤其是当JSON数组里可能存在多种类型值的时候,能避免程序运行时抛出异常。如果你的数组确定只有一种类型(比如全是字符串),也可以直接去掉select分支,直接调用
yajl_get_string(arrayElem)。
内容的提问来源于stack exchange,提问作者Yusuf
相关产品推荐
相关产品推荐

