Как я могу удалить нулевые значения и ключи из JSON с помощью statments cobol - V6.1 COBOL ENTERPRISE

Я не могу понять, как удалить нулевые значения (и соответствующие ключи) из выходного 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.


person Sandhya Thakur    schedule 17.12.2020    source источник
comment
Добавьте свой код COBOL к вопросу.   -  person Gilbert Le Blanc    schedule 17.12.2020
comment
Я не могу поделиться кодом, но я могу поделиться подходами, которые я пробовал:   -  person Sandhya Thakur    schedule 18.12.2020
comment
выполнять изменение utf-8-pos от 1 на 1 до тех пор, пока utf-8-pos = utf-8-end EVAUATE TRUE WHEN JSONOUT(1:utf-8-pos) = X'5C' ==== сначала найти значение \ в o/p выполнить изменение utf-8-pos от 1 на 1, пока JSONOUT(1:utf-8-pos) = x'22' ==== второй поиск строки конечной позиции как X'22' move JSONOUT(1 : utf-8-end - utf-8-pos) to JSONOUT ===== пропустить позицию null end-execute WHEN JSONOUT(1:utf-8-pos) NOT= X'5C' continue WHEN OTHER продолжить END -ОЦЕНИТЕ конечную работу @GilbertLeBlanc   -  person Sandhya Thakur    schedule 18.12.2020
comment
У меня нет под рукой компилятора COBOL, но я думаю, что вам нужен цикл выполнения. Найдите строку \u000 с внешним циклом. Когда вы найдете строку, посмотрите назад на вторую двойную кавычку. Теперь у вас есть начало и конец нулевой строки. Либо удалите символы, либо замените символы пробелами. Удалить персонажей будет сложнее. Вам нужно будет скопировать предшествующие и последующие символы в другое поле x(5000), а затем скопировать весь блок обратно.   -  person Gilbert Le Blanc    schedule 18.12.2020
comment
@SimonSobisch Я разместил пример кода, он будет вам полезен.   -  person Sandhya Thakur    schedule 18.12.2020
comment
@GilbertLeBlanc .. Проблема здесь в том, что вывод JSON сгенерирован в закодированной форме UTF-8, поэтому при использовании модификации ссылки для проверки значений символов, например, для шестнадцатеричного значения X'5C '\', тогда нет никакого эффекта на аргументы utf-8 и не смог найти это значение.   -  person Sandhya Thakur    schedule 18.12.2020
comment
UTF-8 использует ровно один байт для обоих ` and for 0`, поэтому просто итерации по jsonout, пока вы не найдете ascii-значение "\u000, должно быть достаточно, вообще нет необходимости в дополнительной шестнадцатеричной проверке... или мы все не получим проблема, тогда вам придется загрузить образец файла...   -  person Simon Sobisch    schedule 19.12.2020
comment
{header: {timestamp: 2012-12-18T12:43:37.464Z, {payload: customerid: 0} }} Образец файла o/p и требование - удалить идентификатор клиента, который заполнен \u000 ценности. хотите удалить как поле, так и значение из файла o/p. @SimonSobisch   -  person Sandhya Thakur    schedule 21.12.2020


Ответы (2)


Поскольку JSON GENERATE в Enterprise COBOL является универсальной командой, я не думаю, что в 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 (она была добавлена ​​в 6.2 с декабрьским PTF 2020 г.), и я не знаю, будет ли она...

person piet.t    schedule 18.12.2020
comment
Да, есть ограничение на использование всех функций JSON GENERATE в V6.1, поэтому я пытаюсь использовать вышеупомянутые подходы, такие как проверка для удаления null после прочтения большого количества информации о UTF-8, но, похоже, я что-то упускаю. - person Sandhya Thakur; 18.12.2020

Я ничего не знаю о коболе, но мне нужно было то же самое в javascript, поэтому я поделюсь с вами своей функцией javascript. Если вы можете перевести это на кобол, возможно, это поможет вам.

function clearMyJson(obj) {
    for (var i in obj) {
        if ($.isArray(obj[i]))
            if (obj[i].length == 0) //remove empty arrays
                delete obj[i];
            else
                clearMyJson(obj[i]);  //calling function for clear the array
        else if ($.isPlainObject(obj[i]))
            if ((obj[i] == null || obj[i] == "")) // delete property if its null or empty
                delete obj[i];
            else
                clearMyJson(obj[i]); //calling function for clear the object 
    }
}
person cbalakus    schedule 17.12.2020