杰克逊在OracleResultSet的数值周围加上引号

时间:2015-02-10 19:08:20

标签: java json oracle jackson resultset

我正在使用Jackson JSON API在Java中创建JSON对象然后打印。

我的代码类似于:

OracleResultSet rs = getMyResultSet();
OracleResultSetMetaData rsmd = (OracleResultSetMetaData)rs.getMetaData();

int columnCount = rsmd.getColumnCount();
String[] columnNames = new String[columnCount];
int[] columntypes = new int[columnCount];

for(int i = 1; i < columnCount; ++i) {
    columnNames[i] = rsmd.getColumnName(i);
    columnTypes[i] = rsmd.getColumnTypes(i);
}

ObjectMapper mapper = new ObjectMapper();
ObjectNode node;

String columnName;

while(rs.next()) {
    node = mapper.createObjectNode();

    for(int i = 1; i < columnCount; ++i) {
        columnName = columnNames[i];

        //I have a case defined for every OracleTypes.XXXX, but for brevity I'm only putting the one I'm having issues with here
        switch (columnTypes[i]) {
            case: OracleTypes.NUMBER:
                node.put(columnName, rs.getBigDecimal(i)); //BigDecimal chosen based on: http://docs.oracle.com/cd/B19306_01/java.102/b14188/datamap.htm
                break;
            default:
                node.put(columnName, rs.getString(i));
        }

        //UPDATE: the next line is the logic error that I had that was casuing the trouble
        node.put(columnName, rs.getString(i));
    }

    System.out.println(mapper.writeValueAsString(node));
}

这一切都很棒。问题是当我去打印它时。

OracleTypes.NUMBER案例中获取的任何值都会获得引号,即使它们不应该引用。我得到的示例字符串:

{"month":"1","year":"2013","modified":"2013-02-05 13:41:48.0","net":"294.68"}

我想要的是什么:

{"month":"1","year":"2013","modified":"2013-02-05 13:41:48.0","net":294.68}

为什么BigDecimal(或我的测试中的任何非int)在其周围打印引号?我的理解是JSON中的所有实际数值都应该打印没有引号。我认为它可能是一个原始/对象问题,并尝试从BigDecimal获取double值,但这没有帮助。

我已经使用调试器测试了程序,并且它正确地使用了switch-case语句,所以这不是问题。

3 个答案:

答案 0 :(得分:2)

我复制粘贴你的代码并得到你期望的结果(没有引号):

{     “团体”:“书籍”,     “帐户”:“001”,     “年龄”:35岁,     “净”:9.86 }

这可能是版本问题,您使用的是什么版本?

我使用了最新的jackson版本来获得以上输出: 杰克逊核心ASL-1.9.13.jar 杰克逊映射器-ASL-1.9.13.jar

答案 1 :(得分:1)

我发现代码存在问题。最后,我有一个额外的node.put(columnName, rs.getString(i));每次使用值的字符串覆盖该字段。删除它修复了问题。对不起,对不起。

答案 2 :(得分:0)

我认为如果将值设置为double,则可能适用于您。

node.put("net", node.asDouble(bd.doubleValue()));