You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:29:22