2015-07-28 4 views
1

У меня есть таблица базы данных с типом данных JSONB как один из столбцов. Мое приложение в Struts2, которое использует struts2-json.jar для сопоставления запроса и ответа как JSON.Проблема с получением данных JSON из PostgreSQL

Проблема, с которой я столкнулась, заключается в том, что я хочу отправить данные JSON из столбца таблицы в виде массива JSON в ответе. Однако я в конечном итоге отправляю данные как Hash-literal.

Когда метод возвращает УСПЕХ, существует связанная с 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 является членом экземпляра и имеет геттер и сеттер

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> 

Было бы очень полезно, если бы кто-нибудь может показать мне обходной путь для достижения этого.

Заранее спасибо.

ответ

2

Я достиг этого de-serializing с 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" 
}