无法从iSeries(IBM中端)上的JSON数据中检索值

无法从iSeries(IBM中端)上的JSON数据中检索值,json,ibm-midrange,Json,Ibm Midrange,在此之前,我为自己在JSON领域缺乏知识而道歉 我使用SQL在iSeries上创建了一个名为DSITATR的表,该表有两列- UPC 12char, ATRDTA CLOB 4M 然后,我使用以下SQL将一行手动插入表中 在DSITATR值“12345678991”中插入 {包装:6,公斤:0.367,描述:Buzz玩具}' 我已经在SQLRPGLE中编写了一个pgm来检索整个CLOB值,它似乎像预期的那样返回: {包装:6,公斤:0.367,描述:Buzz玩具} 然而,我似乎无法使用JSON_

在此之前,我为自己在JSON领域缺乏知识而道歉

我使用SQL在iSeries上创建了一个名为DSITATR的表,该表有两列- UPC 12char, ATRDTA CLOB 4M

然后,我使用以下SQL将一行手动插入表中

在DSITATR值“12345678991”中插入 {包装:6,公斤:0.367,描述:Buzz玩具}'

我已经在SQLRPGLE中编写了一个pgm来检索整个CLOB值,它似乎像预期的那样返回:

{包装:6,公斤:0.367,描述:Buzz玩具}

然而,我似乎无法使用JSON_值提取值,例如

从DSITATR中选择JSON_VALUEATRDTA,'$.DESC'作为说明

我得到的只是一个空值。我可能在做一些愚蠢的事情,但据我所知,JSON是正确的。有什么想法吗

安德烈·希尔为我工作得很好

您试图在何处运行选择

编辑 我也是7.2,所以这不是你的问题

返回CLOB2G CCSID 1208的JSON_值

CCSID 1208是UTF-8 Unicode

如果您使用的是较旧的客户端Access 5250 emulator,则绿色屏幕5250 STRSQL将无法显示这一点

旧客户端访问或当前客户端访问的运行SQL脚本组件。处理unicode很好,如我的屏幕截图所示

RPGIV ILE RPG可以很好地处理unicode,但是您需要声明数据是unicode格式的 dcl-s myJson varchar200000 ccsid1208

再次尝试使用旧的5250仿真器进行显示/调试会有问题。基于PC的RDi调试器不会有问题

最后但并非最不重要的一点……您可以让系统以您喜欢的EBCDIC CCISD 37=美国英语返回数据

SELECT 
  JSON_VALUE(ATRDTA, '$.DESC' 
            returning varchar(100) ccsid(37)
            ) as Description 
FROM DSITATR

能否将查询更改为以下内容以获取更多信息?选择JSON_VALUEATRDTA,“strict$.DESC”ERROR ON ERROR ON ERROR as Description FROM DISTARI在STRSQL中尝试了这一点,但由于未找到SQL/JSON成员SQLSTATE 2203A而失败。这意味着它是无效的JSON结构还是其他什么?我试着使用IS JSON谓词,结果是成功的。这意味着你的路径出了问题。正如下面指出的,您的仿真器和作业之间的CCSID看起来不匹配,因为仿真器认为是“$”的东西是其他东西。您可以使用查询值HEXCAST“$”作为GRAPHIC1 CCSID 1200来查看系统认为该值是什么。正确答案是0024。如果我将作业ccsid设置为37,将emulator代码页设置为285,则会得到00A2,这是不正确的。我刚刚像上面一样输入了它,除了添加了一个库之外,它使用交互式SQL返回为NULL。我需要在SQL中做些什么来启用JSON吗?我应该指出,从外观上看,我们仍然在运行O/S V7.2。@AndreHill请参见编辑…JSON_值返回unicode数据…我们使用ACS作为仿真器。我似乎已经解决了这个问题,但不知道为什么它会起作用。如果我将JSON_VALUE语句中的路径从“$.DESC”更改为“£.DESC”,则效果良好。这是一个美国对英国的事情,因为我在英国。看起来你的模拟器和你的工作之间有一个CCSID不匹配。在模拟器中,使用communication->configure查看主机代码页。它应该与WRKJOB选项2所示的作业的CCSID相匹配。根据上面的其他回复,您是完全正确的。我的工作是CCSID 37,模拟器是285,所以我得到00A2作为十六进制返回,$0024作为十六进制返回。最好和技术人员核实一下。谢谢你提供的信息。