我不知道如何从输出 JSON 中删除空值(和相应的键)。
使用 JSON GENERATE
,我正在创建 JSON 输出,在输出中我将 \U0000
设为 null。
我想从 JSON 中识别并删除空值和键。
Cobol 版本 - 6.1.0
我正在用 PIC X(5000)
生成一个文件。尝试了 INSPECT
和其他语句,但没有成功 :(
例如:
{
"Item": "A",
"Price": 12.23,
"Qty": 123
},
{
"Item": "B",
"Price": \u000,
"Qty": 234
},
{
"Item": "C",
"Price": 23.2,
"Qty": \u0000
}
我想要的输出:
{
"Item": "A",
"Price": 12.23,
"Qty": 123
},
{
"Item": "B",
"Qty": 234
},
{
"Item": "C",
"Price": 23.2,
}
方法一:
- 使用
JSON GENERATE
命令创建 JSON 并定义输出文件PIC X(50000)
。 - 在转换为 UTF-8 后尝试使用 INSPECT 使用十六进制值查找
'\U000'
但对 UTF8 参数没有影响并且无法搜索'\U000'
值。
perform varying utf-8-pos from 1 by 1
until utf-8-pos = utf-8-end
EVAUATE TRUE
WHEN JSONOUT(1:utf-8-pos) = X'5C' *> first finding a "\" value in o/p
perform varying utf-8-pos from 1 by 1
until JSONOUT(1:utf-8-pos) = x'22' *> second finding a end position string " as X'22'
move JSONOUT(1: utf-8-end - utf-8-pos) to JSONOUT *> skip the position of null
end-perform
WHEN JSONOUT(1:utf-8-pos) NOT= X'5C'
continue
WHEN OTHER
continue
END-EVALUATE
end-perform
方法二:
- 使用
NATIONAL-OF
函数将国家数据项中的项目转换为 UTF-16。 - 使用
INSPECT
、EVALUATE
或PERFORM
使用十六进制值 N'005C' 查找'\U000'
. 但无法找到'\u000'
的正确位置也尝试了NX'005C'
找到但没有运气。
IDENTIFICATION DIVISION.
PROGRAM-ID. JSONTEST.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-370-158.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 root.
05 header.
10 systemId PIC X(10).
10 timestamp PIC X(30).
05 payload.
10 customerid PIC X(10).
77 Msglength PIC 9(05).
77 utf-8-pos PIC 9(05).
77 utf-8-end PIC 9(05).
01 jsonout PIC X(30000).
PROCEDURE DIVISION.
MAIN SECTION.
MOVE "2012-12-18T12:43:37.464Z" to timestamp
MOVE LOW-VALUES to customerid
JSON GENERATE jsonout
FROM root
COUNT IN Msglength
NAME OF root is OMITTED
systemId IS 'id'
ON EXCEPTION
DISPLAY 'JSON EXCEPTION'
STOP RUN
END-JSON
DISPLAY jsonout (1:Msglength)
PERFORM skipnull.
MAIN-EXIT.
EXIT.
Skipnull SECTION.
perform varying utf-8-pos from 1 by 1
until utf-8-pos = utf-8-end
EVALUATE TRUE
WHEN JSONOUT(1:utf-8-pos) = X'5C' *> first finding a "\" value in o/p
perform varying utf-8-pos from 1 by 1
until JSONOUT(1:utf-8-pos) = x'22' *> second finding a end position string " as X'22'
move JSONOUT(1: utf-8-end - utf-8-pos) to JSONOUT *> skip the position of null
end-perform
WHEN JSONOUT(1:utf-8-pos) NOT= X'5C'
continue
WHEN OTHER
continue
END-EVALUATE
end-perform.
Skipnull-exit.
EXIT.
样本输出:因为我们没有任何值可以填充客户 ID,所以在 o/p 结果中我们得到:
{"header" : {
"timestamp" : "2012-12-18T12:43:37.464Z",
"customerid" : "\u0000\u0000\u00000" }
}
结果我想从 o/p 中跳过 customerid。我想跳过 object:Name 来自 o/p 文件。
最佳答案
由于 Enterprise COBOL 的 JSON GENERATE
是一个一体化命令,我认为在 V6.1 中没有一种简单的方法可以做到这一点。
只是为了让您有所期待:Enterprise-COBOL 6.3 提供了一个扩展的SUPPRESS
-子句,它可以满足您的需求:
JSON GENERATE JSONOUT FROM MYDATA COUNT JSONLEN
SUPPRESS WHEN ZERO
ON EXCEPTION DISPLAY 'ERROR JSON-CODE: ' JSON-CODE
NOT ON EXCEPTION DISPLAY 'JSON GENERATED - LEN=' JSONLEN
您还可以抑制 WHEN SPACES
、WHEN LOW-VALUE
或 WHEN HIGH-VALUE
。
您还可以限制对某些字段的抑制:
SUPPRESS Price WHEN ZERO
Qty WHEN ZERO
不幸的是,此功能尚未向后移植到 6.1(已通过 2020 年 12 月的 PTF 添加到 6.2),我不知道它是否会......
关于json - 我如何使用 cobol statments - V6.1 COBOL ENTERPRISE 从 JSON 中删除空值和键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65342362/