繁体   English   中英

无法从PostgreSQL获取JSON数据

[英]Trouble in getting JSON data from PostgreSQL

我有一个使用JSONB数据类型作为列之一的数据库表。 我的应用程序在Struts2中,它使用struts2-json.jar来将请求和响应映射为JSON。

我面临的问题是我希望将表列中的JSON数据作为JSON数组发送到响应中。 但是,我最终将数据作为散列文字发送。

当该方法返回SUCCESS时,将存在一个关联的HashMap,该哈希表用于将数据作为JSON返回。

我在HashMap中将列的名称作为键,并将该列的值作为该键的值。

但是,当struts2-json库按以下方式转换JSON密钥的值时。

{
"status":"success",
"data":[
{
"sem_votes_allowed":{
"type":"jsonb",
"value":"{\"sem_votes_allowed\": [{\"E1\": \"100\", \"E2\": \"200\"}]}"
},
"uvp_even_id":{
"type":"jsonb",
"value":"[\"E1\", \"E2\"]"
},
"usm_x_mobile_no":null,
"usm_pin_no":null,
"sem_first_even_flag":null,
"sem_holdings":{
"type":"jsonb",
"value":"{\"sem_holdings\": [{\"E1\": \"100\", \"E2\": \"200\"}]}"
}
}
],
"action":"sc/get_shareholder_list",
"statusmsg":"Share holder list",
"statuscode":"E_OK"
}

我希望发送的回复是

{
"status":"success",
"data":[
{
"sem_votes_allowed":{
"sem_votes_allowed":[
{
"E1":"100",
"E2":"200"
}
]
},
"uvp_even_id":[
"E1",
"E2"
],
"usm_x_mobile_no":null,
"usm_pin_no":null,
"sem_first_even_flag":null,
"sem_holdings":{
"sem_holdings":[
{
"E1":"10",
"E2":"200"
}
]
}
}
],
"action":"sc/get_shareholder_list",
"statusmsg":"Share holder list",
"statuscode":"E_OK"
}

“ sem_votes_allowed”,“ uvp_even_id”和“ sem_holdings”是表中数据类型为JSONB的列。

以下是在HashMap中填充的代码段。

ResultSetMetaData rsmd = rs.getMetaData();
        int numColumns = rsmd.getColumnCount();

        while (rs.next()) {
        HashMap<String, Object> record = new HashMap<String, Object>();
        for (int i = 1; i < numColumns + 1; i++) {
            String columnName = rsmd.getColumnName(i);
            record.put(columnName, rs.getObject(columnName));

        }
        out.add(record); // ArrayList out
        }

shareDataMap是实例成员,并且具有其getter和setter

HashMap <String,Object> shareDataMap = new HashMap<>();
 shareDataLs = conn.executeQuery(query, params);
        System.out.println("shareDataLs: " + shareDataLs);
        shareDataMap.put(Constants.SUCCESS, Constants.SUCCESS);
        shareDataMap.put(Constants.DATA, shareDataLs);

这是struts.xml中的代码片段

<action name="get_shareholder_list" method="shareHldrLs"
            class="co.merce.instapoll.ui.ShareHldrAction">
            <result type="json" name="success">
                <param name="root">shareDataMap</param>
            </result>
        </action>

如果有人可以向我展示解决此问题的方法,那将非常有帮助。

提前致谢。

我是通过使用GSON api 反序列化来实现的。

 ResultSetMetaData rsmd = rs.getMetaData();
        int numColumns = rsmd.getColumnCount();

        while (rs.next()) {
        HashMap<String, Object> record = new HashMap<String, Object>();
        for (int i = 1; i < numColumns + 1; i++) {
            String columnName = rsmd.getColumnName(i);

            //MODIFIED BY LALIT RAO @ 29-07-2015
            //THE BELOW CODE DESERIALIZES THE JSON ARRAY AND HASH-VALUE INTO JAVA STRING FOR struts2-json jar to convert it back to json in  response.

            if (columnName.equalsIgnoreCase("sem_holdings") || columnName.equalsIgnoreCase("sem_votes_allowed") || columnName.equalsIgnoreCase("gc_even_desc")){

            System.out.println("Inside Map<String, ArrayList<HashMap<String,String>>> if block");
            Map<String, ArrayList<HashMap<String,String>>> retMap = new Gson().fromJson(rs.getString(columnName), new TypeToken<HashMap<String, ArrayList<HashMap<String,String>>>>() {}.getType());
                record.put(columnName, retMap);
            }
            else if (columnName.equalsIgnoreCase("sem_ev_id") || columnName.equalsIgnoreCase("uvp_even_id") || columnName.equalsIgnoreCase("gc_ev_id")){

            System.out.println("Inside List <String> else-if block");
            List <String> retList = new Gson().fromJson(rs.getString(columnName), new TypeToken<List<String>>() {}.getType());
                record.put(columnName, retList);
            }
            else
            record.put(columnName, rs.getObject(columnName));

        }
        out.add(record); // ArrayList out
        }

发送回AngularJS的响应是

{
"status":"success",
"data":[
        "sem_votes_allowed":{
                            "sem_votes_allowed":[{
                                                   "E2":"200", "E1":"100"
                                                }]
                            },
        "usm_typ_flg":null,
        "uvp_user_id":"1",
        "sem_x_visitedat":"2015-07-23T06:15:21",
        "uvp_even_id":[
                       "11196","11197"
                      ],
        "usm_x_mobile_no":null,
        "usm_pin_no":null,
        "sem_holdings":{
                       "sem_holdings":[{
                                        "E2":"100","E1":"100"
                                      }]
                       },
 ],
"action":"sc/get_shareholder_list",
"statusmsg":"Share holder list",
"statuscode":"E_OK"
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM