Я не могу понять, как удалить нулевые значения (и соответствующие ключи) из выходного JSON.
Используя JSON GENERATE
, я создаю вывод JSON, и на выходе я получаю \U0000
как ноль.
Я хочу идентифицировать и удалить нулевые значения и ключи из JSON.
Кобол версия - 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,
}
Подход 1:
- создал JSON с помощью команды
JSON GENERATE
и определил выходной файл в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
Подход 2:
- Преобразуйте элемент в UTF-16 в национальном элементе данных с помощью функции
NATIONAL-OF
. - используя
INSPECT
,EVALUATE
ИЛИPERFORM
, чтобы найти'\U000'
, используя шестнадцатеричное значение N'005C'. но не смог найти правильное положение'\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.
пример вывода: поскольку у нас нет значения для заполнения идентификатора клиента, поэтому в результатах o/p мы получаем:
{"header" : {
"timestamp" : "2012-12-18T12:43:37.464Z",
"customerid" : "\u0000\u0000\u00000" }
}
в результате я хочу пропустить идентификатор клиента из файла o/p. Я хочу пропустить оба объекта: имя из файла o/p.
` and for
0`, поэтому просто итерации поjsonout
, пока вы не найдете ascii-значение"\u000
, должно быть достаточно, вообще нет необходимости в дополнительной шестнадцатеричной проверке... или мы все не получим проблема, тогда вам придется загрузить образец файла... - person Simon Sobisch   schedule 19.12.2020