【问题标题】:Jackson putting quotes around numeric values from OracleResultSetJackson 在 OracleResultSet 的数值周围加上引号
【发布时间】:2015-02-10 19:08:20
【问题描述】:

我正在使用 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(或我的测试中的任何非整数)在打印时带有引号?我的理解是 JSON 中的所有实数值都应该不带引号打印。我认为这可能是原始/对象问题,并尝试从 BigDecimal 获取双精度值,但这没有帮助。

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

【问题讨论】:

标签: java json oracle jackson resultset


【解决方案1】:

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

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

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

我使用最新的杰克逊版本来获得上述输出: 杰克逊核心asl-1.9.13.jar jackson-mapper-asl-1.9.13.jar

【讨论】:

  • 杰克逊 2.4.4 也没有问题
  • 我正在使用 'com.fasterxml.jackson.core:jackson-databind:2.5.0' 我已经更新了代码示例,以准确地向您展示我在做什么。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多