从Java中的Json字符串生成聚合的Json数据

如何解决从Java中的Json字符串生成聚合的Json数据

我已经从db2中获取了JSON字符串,需要对数据进行分组。

SELECT JSON_ARRAY(JSON_OBJECT('id' VALUE id,'items' VALUE JSON_OBJECT('item' value item,'itemScore' value itemScore,'stage' value stage,'reco' VALUE JSON_OBJECT('product' value product,'url' value url,'score' value score
                                                                         format json)format json absent on null)
                   format json absent on null)format json absent on null)
FROM Product
GROUP BY id,item,itemScore,stage,url,product,score

如果Java或DB2查询中有解决方案,这将有所帮助。

需要使用id对JSON字符串执行分组。

JSON字符串:

[{
    "id": 2078012,"items": {
        "item": "cos","itemScore": -0.1334,"stage": 0.5,"reco": {
            "product": "Language","url": "https://","score": 0.019
        }
    }
},{
    "id": 2078012,"items": {
        "item": "build","itemScore": -0.2858,"reco": {
            "product": "Notifications","score": 0.0169
        }
    }
}]

预期输出: 需要使用ID对项目进行分组

我已经修改了预期的JSON,请帮助我创建更新的JSON。

[{
    "id": 2078012,"reco": [{
            "product": "Language","score": 0.019
        },{
            "product": "Notifications","score": 0.0169
        }]
    },"score": 0.0169
        }]
    }
}]

解决方法

您可能需要将其分解成几个步骤。

首先,一个与您的基表相似的基表。

db2 => SELECT * FROM PROD_T

ID          ITEM                 ITEMSCORE STAGE PRODUCT              URL                  SCORE
----------- -------------------- --------- ----- -------------------- -------------------- -------
    2078012 cos                    -0,1334   0,5 Language             https://              0,0190
    2078012 build                  -0,2585   0,5 Notification         https://              0,1690
    2100000 alpha                  -0,5 Letter               https://              0,0190
    2100000 beta                   -0,5 anouncement          https://              0,1690

步骤1:创建基本级别的json对象

select id,item,JSON_OBJECT('item' value item,'itemScore' value itemScore,'stage' value stage,'reco' VALUE JSON_OBJECT('product' value product,'url' value url,'score' value score 
                                        FORMAT JSON ) 
                FORMAT JSON ABSENT ON NULL  
               RETURNING VARCHAR(200) FORMAT JSON) ITEM_JSON  
FROM PROD_T 

ID          ITEM                 ITEM_JSON
----------- -------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    2078012 cos                  {"item":"cos","itemScore":-0.1334,"stage":0.5,"reco":{"product":"Language","url":"https:\/\/","score":0.0190}}
    2078012 build                {"item":"build","itemScore":-0.2585,"reco":{"product":"Notification","score":0.1690}}
    2100000 alpha                {"item":"alpha","reco":{"product":"Letter","score":0.0190}}
    2100000 beta                 {"item":"beta","reco":{"product":"anouncement","score":0.1690}}

步骤2:按ID分组,然后将对象汇总到一个数组中。

WITH BASE AS ( 
select id,'score' value score 
                                        FORMAT JSON ) 
                FORMAT JSON ABSENT ON NULL  
               RETURNING VARCHAR(200) FORMAT JSON) ITEM_JSON  
FROM PROD_T  ) 
 SELECT ID,JSON_ARRAY ( LISTAGG( ITEM_JSON,',') WITHIN GROUP (ORDER BY ITEM) FORMAT JSON ) ITEMS_ARRAY
 FROM BASE GROUP BY ID 


ID          ITEMS_ARRAY
----------- --------------------------------------------------
    2078012 [{"item":"build","score":0.1690}},{"item":"cos","score":0.0190}}] 
    2100000 [{"item":"alpha","score":0.0190}},{"item":"beta","score":0.1690}}] 

第3步:为每个id行创建整个json_object

WITH BASE AS ( 
select id,'score' value score 
                                        FORMAT JSON ) 
                FORMAT JSON ABSENT ON NULL  
               RETURNING VARCHAR(200) FORMAT JSON) ITEM_JSON  
FROM PROD_T  ) 
 SELECT JSON_OBJECT ( KEY 'id' VALUE ID,KEY 'itens' VALUE 
                   JSON_ARRAY ( LISTAGG( ITEM_JSON,') WITHIN GROUP (ORDER BY ITEM) FORMAT JSON ) 
            FORMAT JSON ) json_objects 
 FROM BASE GROUP BY ID 


json_objects 
-----------------------------------------------------------------------------------------------------------------------------------
{"id":2078012,"itens":[{"item":"build","score":0.0190}}]} 
{"id":2100000,"itens":[{"item":"alpha","score":0.1690}}]}

第4步:完整的ID的json文档数组

下面的查询应该可以工作

WITH BASE AS ( 
select id,'score' value score 
                                        FORMAT JSON ) 
                FORMAT JSON ABSENT ON NULL  
               RETURNING VARCHAR(200) FORMAT JSON) ITEM_JSON  
FROM PROD_T  ),PROD_OBJS AS ( 
     SELECT  JSON_OBJECT ( KEY 'id' VALUE ID,') WITHIN GROUP (ORDER BY ITEM) FORMAT JSON ) 
            FORMAT JSON ) json_objects 
     FROM BASE GROUP BY ID ) 
SELECT JSON_ARRAY (select json_objects FROM PROD_OBJS format json) FROM SYSIBM.SYSDUMMY1

但是,在我的系统(DB2 v11.5.0.1077)中,它由于内部编译错误而失败:

SQL0901N由于数据库,SQL语句或命令失败 系统错误。 (原因为“意外的agg opparm”。)SQLSTATE = 58004

但是,如果您遇到相同的情况,则可以在临时表中实现来自step3的输出,并从中执行最终数组。

DECLARE GLOBAL TEMPORARY TABLE prod_json_objcts AS ( 
WITH BASE AS ( 
select id,') WITHIN GROUP (ORDER BY ITEM) FORMAT JSON ) 
            FORMAT JSON ) json_objects 
 FROM BASE GROUP BY ID 
) WITH DATA 

SELECT JSON_ARRAY (select json_objects FROM session.prod_json_objcts format json) FROM SYSIBM.SYSDUMMY1 

产生最终的json数组:

[{"id":2078012,"itens":[
      {"item":"build","score":0.0190}}
    ]
 },{"id":2100000,"itens":[
      {"item":"alpha","score":0.1690}}
    ]
 }
]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res