代码之家  ›  专栏  ›  技术社区  ›  Matthew Herbst

Jackson在OracleResultSet的数值周围加引号

  •  1
  • Matthew Herbst  · 技术社区  · 10 年前

    我使用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 case正在获取引号,即使它们不应该。我正在获取的示例字符串:

    {"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中获取双倍值,但这没有帮助。

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

    3 回复  |  直到 10 年前
        1
  •  2
  •   Alon Eirew    10 年前

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

    { “组”:“书本”, “account”:“001”, “年龄”:35岁, “净”:9.86 }

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

    我使用了最新的jackson版本来获得以上输出: jackson-core-asl-19.13.jar jackson-maper-asl-1.9.13.jar

        2
  •  2
  •   Matthew Herbst    10 年前

    我发现代码有问题。最后,我多了一个 node.put(columnName, rs.getString(i)); 这是每次用值的字符串覆盖字段。删除它解决了问题。很抱歉给大家带来了麻烦。

        3
  •  0
  •   user3138997    10 年前

    我认为如果你将值设置为double if,可能会对你有用。

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