【问题标题】:How I can remove null values and keys from JSON using cobol statments- V6.1 COBOL ENTERPRISE如何使用 cobol statments- V6.1 COBOL ENTERPRISE 从 JSON 中删除空值和键
【发布时间】: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。
  • 使用 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。我想从 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 for 0 都使用了一个字节 - 所以只需迭代 jsonout 直到找到 ascii 值 "\u000 就足够了,不需要额外的十六进制- 完全检查...否则我们都没有得到问题,那么您必须上传示例文件...

标签: json cobol codepages


【解决方案1】:

由于 Enterprise COBOL 的 JSON GENERATE 是一个一体式命令,我认为在 V6.1 中没有简单的方法来做到这一点。

只是为了给您一些期待:Enterprise-COBOL 6.3 提供了一个扩展的SUPPRESS-clause,可以满足您的需要:

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),我不知道它是否会......

【讨论】:

  • 是的,在 V6.1 中使用 JSON GENERATE 的所有功能是有限制的,这就是我尝试上述方法的原因,例如在阅读大量有关 UTF-8 的信息后删除 null 但是好像我错过了什么。
【解决方案2】:

我对cobol一无所知,但我在javascript中需要同样的东西,所以我会为你分享我的javascript函数。如果你能把它翻译成cobol,也许它会对你有所帮助。

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 
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2022-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多