json - 我如何使用 cobol statments - V6.1 COBOL ENTERPRISE 从 JSON 中删除空值和键

标签 json cobol codepages

我不知道如何从输出 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。
  • 使用 INSPECTEVALUATEPERFORM 使用十六进制值 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 SPACESWHEN LOW-VALUEWHEN 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/

相关文章:

ios - 方法不会将接收到的 JSON 对象保存到数组中

javascript - NodeJS : HTTP response fired twice

cobol - 在 COBOL 中打开文件以进行读取

linux - MS Access *.MDB 转换为 MySQL 或 SQLite,数据编码问题

java - 从 java Charset 对象获取数字代码页

javascript - 使用 JQuery.getJSON() 从 json 文件加载 contextmenu

javascript - Three.js - 在代码中包含网格数据

java - Visual Cobol 2010 和 eclipse

c# - COM 互操作 : Variable number of parameters

windows - 如果我的 OEMCP 设置为 437 那么为什么我的 cmd.exe 默认代码页是 932?我该如何解决这个问题?