有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    在进一步挖掘之后,我找到了一个可行的解决办法。通过如下将测试Java类组合到JSP中,我得到了正确的输出。我不确定为什么这样做有效,而原来没有

    <%@ 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();
    %>