从 PostgreSQL 获取 JSON 数据时遇到问题
Trouble in getting JSON data from PostgreSQL
我有一个数据库 table,其列之一是 JSONB 数据类型。
我的应用程序在 Struts2 中,它使用 struts2-json.jar 将请求和响应映射为 JSON。
我面临的问题是我希望从 table 列发送 JSON 数据作为响应中的 JSON 数组。但是我最终将数据作为哈希文字发送。
当方法 return 成功时,有一个关联的 HashMap 用于 return 数据作为 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" 是 table 中数据类型为 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>
如果有人能向我展示实现此目的的解决方法,那将非常有帮助。
提前致谢。
我通过 de-serializing it with 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"
}
我有一个数据库 table,其列之一是 JSONB 数据类型。 我的应用程序在 Struts2 中,它使用 struts2-json.jar 将请求和响应映射为 JSON。
我面临的问题是我希望从 table 列发送 JSON 数据作为响应中的 JSON 数组。但是我最终将数据作为哈希文字发送。
当方法 return 成功时,有一个关联的 HashMap 用于 return 数据作为 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" 是 table 中数据类型为 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>
如果有人能向我展示实现此目的的解决方法,那将非常有帮助。
提前致谢。
我通过 de-serializing it with 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"
}