Jackson 在 OracleResultSet 的数值周围加上引号
Jackson putting quotes around numeric values from OracleResultSet
我正在使用 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 中的所有实数值都应该不带引号打印。我认为这可能是一个 primitive/object 问题,并尝试从 BigDecimal 获取双精度值,但这没有帮助。
我已经使用调试器测试了该程序,它确实正确使用了 switch-case 语句,所以这不是问题所在。
我认为如果您将值设置为 double if 可能对您有用。
node.put("net", node.asDouble(bd.doubleValue()));
我复制粘贴了您的代码并得到了您期望的结果(无引号):
{
"groups": "books",
"account": "001",
"age": 35,
"net":9.86
}
这可能是版本问题,您使用的是什么版本?
我使用最新的 jackson 版本获得以上输出:
jackson-core-asl-1.9.13.jar
jackson-mapper-asl-1.9.13.jar
我发现我的代码有问题。最后,我有一个额外的 node.put(columnName, rs.getString(i));
这每次都用值的字符串覆盖该字段。删除它解决了问题。抱歉给大家添麻烦了。
我正在使用 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 中的所有实数值都应该不带引号打印。我认为这可能是一个 primitive/object 问题,并尝试从 BigDecimal 获取双精度值,但这没有帮助。
我已经使用调试器测试了该程序,它确实正确使用了 switch-case 语句,所以这不是问题所在。
我认为如果您将值设置为 double if 可能对您有用。
node.put("net", node.asDouble(bd.doubleValue()));
我复制粘贴了您的代码并得到了您期望的结果(无引号):
{ "groups": "books", "account": "001", "age": 35, "net":9.86 }
这可能是版本问题,您使用的是什么版本?
我使用最新的 jackson 版本获得以上输出: jackson-core-asl-1.9.13.jar jackson-mapper-asl-1.9.13.jar
我发现我的代码有问题。最后,我有一个额外的 node.put(columnName, rs.getString(i));
这每次都用值的字符串覆盖该字段。删除它解决了问题。抱歉给大家添麻烦了。