【发布时间】:2020-12-17 14:11:43
【问题描述】:
我不知道如何从输出 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。我想从 o/p 文件中跳过两个 object:Name。
【问题讨论】:
-
将您的 COBOL 代码添加到问题中。
-
我无法分享代码,但我可以分享我尝试过的方法:
-
执行 utf-8-pos 从 1 到 1 的变化,直到 utf-8-pos = utf-8-end EVAUATE TRUE WHEN JSONOUT(1:utf-8-pos) = X'5C' = === 首先在 o/p 中找到一个 "\" 值执行从 1 到 1 的不同 utf-8-pos 直到 JSONOUT(1:utf-8-pos) = x'22' ==== 第二个找到结束位置string " as X'22' move JSONOUT(1: utf-8-end - utf-8-pos) 到 JSONOUT ===== 跳过 null end-perform WHEN JSONOUT(1:utf-8-pos) 的位置NOT= X'5C' continue WHEN OTHER continue END-EVALUATE end-perform @GilbertLeBlanc
-
我手边没有 COBOL 编译器,但我认为您需要一个执行循环。查找带有外循环的字符串“\u000”。找到字符串后,向后看第二个双引号。您现在有了空字符串的开头和结尾。删除字符或用空格替换字符。删除字符会更加困难。您必须将前面的字符和后面的字符复制到另一个 x(5000) 字段,然后将整个块复制回来。
-
UTF-8 对
` and for0 都使用了一个字节 - 所以只需迭代jsonout直到找到 ascii 值"\u000就足够了,不需要额外的十六进制- 完全检查...否则我们都没有得到问题,那么您必须上传示例文件...