首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用gson在JSP页面中序列化POJO时,输出为空。我遗漏了什么?

当使用gson在JSP页面中序列化POJO时,输出为空。我遗漏了什么?
EN

Stack Overflow用户
提问于 2015-09-30 22:11:22
回答 1查看 255关注 0票数 0

我有一个JSP页面,它运行数据库查询并将结果序列化为JSON。我正在序列化的对象是:

代码语言:javascript
复制
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)如下所示:

代码语言:javascript
复制
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实例正在得到正确的填充:

代码语言:javascript
复制
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和字符集在标头中得到了正确的设置。

下面的Java代码确实产生了预期的JSON..。

代码语言:javascript
复制
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,列=列-0,列-1,data=[排-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-5:Col-1,Row-6:Col-0,第6行:COL-1,Row-7:Col-0,Row-7:Col-1,Row-8:Col-1,Row-9:Col-0,Row-9:Col-1,Row-10:Col-1,Row-11:Col-1,Row-12:Col-0,Row-12:Col-1,Row-13:Col-0,Row-13:Col-1,Row-14:Col-0,第14行:COL-1,Row-15:Col-0,Row-15:Col-1,Row-16:Col-1,Row-17:Col-1,Row-18:Col-1,Row-18:Col-1,Row-19:Col-0,Row-19:Col-1] {"iTotalRecords":20,"iTotalDisplayRecords":20,"sEcho":"1",“列”:“列”,“列-1”、“数据”:[“排-0:科勒-0”、“排-0:科尔-1”、“排-1:科尔-0”、“排-1:科尔-1”、“排-2:科尔-0”、“排-2:科尔-1”、“排-3:科尔-0”、“排-3:科尔-1”、“排-4:科尔-0”、“排-4:科尔-1”,“第5排:科尔-0”、“第5排:科尔-1”、“第6排:科尔-0”、“第6排:科尔-1”、“第7排:科尔-0”、“第7排:科尔-1”、“第8排:科尔-0”、“第8排:科尔-1”、“第9排:科尔-0”、“第9排:科尔-1”、“第10排:科尔-0”、“第10排:科尔-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”}}

EN

回答 1

Stack Overflow用户

发布于 2015-10-08 17:00:48

在深入挖掘之后,我找到了一个可行的解决方案。通过将测试Java类组合到JSP中(如下所示),我得到了正确的输出。我不知道为什么这件事起作用了,而原来的

代码语言:javascript
复制
<%@ page
   language="java"
   session="true"
   contentType="application/json; charset=UTF-8"
%>
<%@ page import="com.google.gson.Gson,
                java.lang.reflect.Type,
                com.google.gson.reflect.TypeToken,
                java.util.ArrayList,
                java.sql.*,
                org.apache.log4j.Category,
                com.foo.bar.*;"
%>
<% 
final org.apache.log4j.Category LOG = org.apache.log4j.Category.getInstance ("JSP");

class db_json {

    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 String testJson(HttpServletRequest request){
        String queryOvr = "select 'error' as Input_Parameters";
        LOG.debug("db_json3.jsp - QUERY: " + queryOvr);
        Gson gson = new Gson();
        int rowCount=0;
        int totalCount=0;
        Statement stmt = null;
        ResultSet returnData = null;
        Connection conn = null;
        try {
            conn = DatabaseUtilities.getConnection();
                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.debug("db_json3.jsp - HEADER: " + headerName);
                    headerRow.add(headerName);
                }
                dObj.setColumns(headerRow);

                // write data
                ArrayList<ArrayList<String>> dataArray = new ArrayList<ArrayList<String>>();
                while ( returnData.next() ) {
                    if ( rowCount>=iDisplayStart && iDisplayLength>=0 && rowCount<iDisplayLength ) {
                        rowCount++;
                        ArrayList<String> dataRow = new ArrayList<String>();
                        for (int i=0; i<colCount; i++){ 
                            String dbData = returnData.getString(i+1);
                            LOG.debug("db_json3.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.debug("db_json3.jsp - OBJ: " + dObj.toString());
                Type typeResults = new TypeToken<DataObject>(){}.getType();
                String json = gson.toJson(dObj, typeResults);
                LOG.debug("db_json3.jsp - JSON: " + json);
                return json;
        }
        catch (Throwable t) {
            LOG.debug("db_json3.jsp - Error: " + t.toString());
            return gson.toJson(t);
        }
    }
}
db_json dbjson = new db_json();
String json = dbjson.testJson();
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().write(json);
response.getWriter().flush();
response.getWriter().close();
%>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32876434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档