java使用gson序列化JSP页面中的POJO时,输出为空。我错过了什么?
我有一个运行数据库查询并将结果序列化为JSON的JSP页面。我正在序列化的对象是:
class DataObject {
private int iTotalRecords;
private int iTotalDisplayRecords;
private String sEcho;
private ArrayList<String> columns;
private ArrayList<ArrayList<String>> data;
//getter and setter methods
public void setColumns( ArrayList<String> cols ) {
columns = cols;
}
public void setTotalDisplayRecords( int _numrecs ) {
iTotalDisplayRecords = _numrecs;
}
public void setTotalRecords( int _numrecs ) {
iTotalRecords = _numrecs;
}
public void setData( ArrayList<ArrayList<String>> _data ) {
data = _data;
}
public void setEcho( String _echo ) {
sEcho = _echo;
}
@Override
public String toString() {
return "DataObject [iTotalRecords=" + iTotalRecords +
", iTotalDisplayRecords=" + iTotalDisplayRecords +
", sEcho=" + sEcho +
", columns=" + columns +
", data=" + data + "]";
}
public DataObject() {
this.sEcho = "1";
this.iTotalDisplayRecords = 0;
this.iTotalRecords = 0;
this.columns = new ArrayList<String>();
this.data = new ArrayList<ArrayList<String>>();
}
}
我简化了页面,JSP(仍然生成空白JSON)如下所示:
String queryOvr = "select 'error' as Input_Parameters";
String sEcho = "0";
LOG.error("db_json_test.jsp - QUERY: " + queryOvr);
int rowCount=0;
int totalCount=0;
Statement stmt = null;
ResultSet returnData = null;
Connection conn = null;
try {
conn = DatabaseUtilities.getConnection(); //proprietary connection pool of host application
stmt = conn.createStatement();
returnData = stmt.executeQuery(queryOvr);
ResultSetMetaData rsmd = returnData.getMetaData();
DataObject dObj = new DataObject();
ArrayList<String> headerRow = new ArrayList<String>();
int colCount = rsmd.getColumnCount();
// write column names
for (int i=0; i<colCount; i++) {
String headerName = rsmd.getColumnName(i+1);
if ("".equals(headerName)) {
headerName = "Column-" + String.valueOf(i+1);
}
LOG.error("db_json_test.jsp - HEADER: " + headerName);
headerRow.add(headerName);
}
dObj.setColumns(headerRow);
// write data
ArrayList<ArrayList<String>> dataArray = new ArrayList<ArrayList<String>>();
while ( returnData.next() ) {
rowCount++;
ArrayList<String> dataRow = new ArrayList<String>();
for (int i=0; i<colCount; i++){
String dbData = returnData.getString(i+1);
LOG.error("db_json_test.jsp - DATA: row: " + headerRow.get(i) + ", value: " + dbData);
dataRow.add(dbData);
}
dataArray.add(dataRow);
totalCount++;
}
dObj.setData(dataArray);
dObj.setEcho(sEcho);
dObj.setTotalRecords(totalCount);
dObj.setTotalDisplayRecords(rowCount);
LOG.error("db_json_test.jsp - OBJ: " + dObj.toString());
Type typeResults = new TypeToken<DataObject>(){}.getType();
Gson gson = new Gson();
String json = gson.toJson(dObj, typeResults);
LOG.error("db_json_test.jsp - JSON: " + json);
//gson.toJson(dObj, typeResults, response.getWriter());
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().write(json);
response.getWriter().flush();
response.getWriter().close();
}
catch (Throwable t) {
LOG.error("db_json.jsp - Error: " + t.toString());
//t.printStackTrace();
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().write("{\"error\":\"" + t.toString() + "\"}");
response.getWriter().flush();
response.getWriter().close();
}
当我查看日志时,我可以看到DataObject实例正在正确填充:
783167943 30 Sep 2015 17:37:51,924 ERROR [http-8500-1] JSP - db_json_test.jsp - QUERY: select 'error' as Input_Parameters
783167959 30 Sep 2015 17:37:51,940 ERROR [http-8500-1] JSP - db_json_test.jsp - HEADER: Input_Parameters
783167959 30 Sep 2015 17:37:51,940 ERROR [http-8500-1] JSP - db_json_test.jsp - DATA: row: Input_Parameters, value: error
783167959 30 Sep 2015 17:37:51,940 ERROR [http-8500-1] JSP - db_json_test.jsp - OBJ: DataObject [iTotalRecords=1, iTotalDisplayRecords=1, sEcho=0, columns=[Input_Parameters], data=[[error]]]
783167959 30 Sep 2015 17:37:51,940 ERROR [http-8500-1] JSP - db_json_test.jsp - JSON:
但是,当我使用gson序列化它时。toJson(dObj)我得到一个空字符串。我已经尝试过指定上面示例中所示的类型,但没有得到不同的结果。除了我可能不应该在JSP文件中这样做的争论之外,我还缺少什么
值得注意的是,catch例程确实将错误消息作为有效的JSON返回,因此contentType和charset在头中得到了正确设置
以下Java代码确实生成了预期的JSON
public class gsonTest {
class DataObject {
private int iTotalRecords;
private int iTotalDisplayRecords;
private String sEcho;
private ArrayList<String> columns;
private ArrayList<ArrayList<String>> data;
// getter and setter methods
public void setColumns(ArrayList<String> cols) {
columns = cols;
}
public void setTotalDisplayRecords(int _numrecs) {
iTotalDisplayRecords = _numrecs;
}
public void setTotalRecords(int _numrecs) {
iTotalRecords = _numrecs;
}
public void setData(ArrayList<ArrayList<String>> _data) {
data = _data;
}
public void setEcho(String _echo) {
sEcho = _echo;
}
@Override
public String toString() {
return "DataObject [iTotalRecords=" + iTotalRecords
+ ", iTotalDisplayRecords=" + iTotalDisplayRecords
+ ", sEcho=" + sEcho
+ ", columns=" + columns
+ ", data=" + data + "]";
}
public DataObject() {
this.sEcho = "";
this.iTotalDisplayRecords = 0;
this.iTotalRecords = 0;
this.columns = new ArrayList<String>();
this.data = new ArrayList<ArrayList<String>>();
}
}
public static void main(String[] args) {
int totalCount = 0;
String sEcho = "1";
Gson gson = new Gson();
gsonTest tst = new gsonTest();
Type typeResults = new TypeToken<DataObject>(){}.getType();
DataObject obj = tst.new DataObject();
ArrayList<String> headerRow = new ArrayList<String>();
// write column names
int colCount = 2;
for (int i = 0; i < colCount; i++) {
headerRow.add("Column-" + String.valueOf(i));
}
obj.setColumns(headerRow);
// write data
ArrayList<ArrayList<String>> dataArray = new ArrayList<ArrayList<String>>();
int rowCount = 0;
while (rowCount < 20) {
ArrayList<String> dataRow = new ArrayList<String>();
for (int i = 0; i < colCount; i++) {
dataRow.add("Row-" + String.valueOf(rowCount) + ":Col-"
+ String.valueOf(i));
}
rowCount++;
dataArray.add(dataRow);
totalCount++;
}
obj.setData(dataArray);
obj.setEcho(sEcho);
obj.setTotalRecords(totalCount);
obj.setTotalDisplayRecords(rowCount);
String output = gson.toJson(obj,typeResults);
System.out.println(obj.toString());
System.out.println(output);
}
}
以下是输出:
DataObject [iTotalRecords=20, iTotalDisplayRecords=20, sEcho=1, columns=[Column-0, Column-1], data=[[Row-0:Col-0, Row-0:Col-1], [Row-1:Col-0, Row-1:Col-1], [Row-2:Col-0, Row-2:Col-1], [Row-3:Col-0, Row-3:Col-1], [Row-4:Col-0, Row-4:Col-1], [Row-5:Col-0, Row-5:Col-1], [Row-6:Col-0, Row-6:Col-1], [Row-7:Col-0, Row-7:Col-1], [Row-8:Col-0, Row-8:Col-1], [Row-9:Col-0, Row-9:Col-1], [Row-10:Col-0, Row-10:Col-1], [Row-11:Col-0, Row-11:Col-1], [Row-12:Col-0, Row-12:Col-1], [Row-13:Col-0, Row-13:Col-1], [Row-14:Col-0, Row-14:Col-1], [Row-15:Col-0, Row-15:Col-1], [Row-16:Col-0, Row-16:Col-1], [Row-17:Col-0, Row-17:Col-1], [Row-18:Col-0, Row-18:Col-1], [Row-19:Col-0, Row-19:Col-1]]] {"iTotalRecords":20,"iTotalDisplayRecords":20,"sEcho":"1","columns":["Column-0","Column-1"],"data":[["Row-0:Col-0","Row-0:Col-1"],["Row-1:Col-0","Row-1:Col-1"],["Row-2:Col-0","Row-2:Col-1"],["Row-3:Col-0","Row-3:Col-1"],["Row-4:Col-0","Row-4:Col-1"],["Row-5:Col-0","Row-5:Col-1"],["Row-6:Col-0","Row-6:Col-1"],["Row-7:Col-0","Row-7:Col-1"],["Row-8:Col-0","Row-8:Col-1"],["Row-9:Col-0","Row-9:Col-1"],["Row-10:Col-0","Row-10:Col-1"],["Row-11:Col-0","Row-11:Col-1"],["Row-12:Col-0","Row-12:Col-1"],["Row-13:Col-0","Row-13:Col-1"],["Row-14:Col-0","Row-14:Col-1"],["Row-15:Col-0","Row-15:Col-1"],["Row-16:Col-0","Row-16:Col-1"],["Row-17:Col-0","Row-17:Col-1"],["Row-18:Col-0","Row-18:Col-1"],["Row-19:Col-0","Row-19:Col-1"]]}
# 1 楼答案
在进一步挖掘之后,我找到了一个可行的解决办法。通过如下将测试Java类组合到JSP中,我得到了正确的输出。我不确定为什么这样做有效,而原来没有