Jackson中的ValueNode的所有子类(JSON库)具有用于获取基础值对象的不同方法,例如IntNode有getIntValue,BooleanNode有getBooleanValue等等.
为什么没有调用简单的getValue的泛型/多态方法只返回一个Object,并且该Object是Integer或Boolean等,根据调用该方法的节点类型?
或者……实际上有这样的方法吗?
我需要这样的方法用于我的目的但似乎图书馆设计师没有发现添加这样的方法会有用.或者……出于某种原因,该方法是否故意丢失?
我的目的:在下面的代码中,我遍历树并生成仅由HashMap,Object []和Java基本类型(如Integer,Boolean等)组成的结构.如果我有这样的方法,而不是所有这些if-else if-else if块,我将只有一个方法调用(在JsonNode是叶节点即ValueNode的子类型的情况下).但是我似乎没有杰克逊这样的方法.所以我必须编写所有那些丑陋的if-else if-else if blocks.
码:
@SuppressWarnings({ "rawtypes", "unchecked" })
private static Object traverse(JsonNode nd) {
if (nd instanceof ObjectNode) {
ObjectNode ndd = (ObjectNode) nd;
HashMap mp = new HashMap();
Iterator it = ndd.getFieldNames();
while (it.hasNext()) {
String s = it.next();
mp.put(s, traverse(ndd.get(s)));
}
return mp;
} else if (nd instanceof ArrayNode) {
ArrayNode ndd = (ArrayNode) nd;
Object[] arr = new Object[ndd.size()];
for (int i = 0; i < ndd.size(); i++) {
arr[i] = traverse(ndd.get(i));
}
return arr;
} else if (nd instanceof NullNode) {
// NullNode ndd = (NullNode)nd;
return null;
} else if (nd instanceof BooleanNode) {
BooleanNode ndd = (BooleanNode) nd;
return ndd.getBooleanValue();
} else if (nd instanceof IntNode) {
IntNode ndd = (IntNode) nd;
return ndd.getIntValue();
} else if (nd instanceof LongNode) {
LongNode ndd = (LongNode) nd;
return ndd.getLongValue();
} else if (nd instanceof DoubleNode) {
DoubleNode ndd = (DoubleNode) nd;
return ndd.getDoubleValue();
} else if (nd instanceof DecimalNode) {
DecimalNode ndd = (DecimalNode) nd;
return ndd.getDecimalValue();
} else if (nd instanceof BigIntegerNode) {
BigIntegerNode ndd = (BigIntegerNode) nd;
return ndd.getBigIntegerValue();
} else if (nd instanceof TextNode) {
TextNode ndd = (TextNode) nd;
return ndd.getTextValue();
}
throw new IllegalStateException("Failed while traversing the JSON tree at node: ||| " + nd.asText() + " |||");
}
解决方法:
因为你要返回一个Object,你可以使用这样的东西
ObjectMapper mapper = new ObjectMapper();
return mapper.convertValue(nd,Object.class);
对于这个特定的测试用例,它有效
JsonNode nodeBool = BooleanNode.TRUE;
Object objectBool = mapper.convertValue(nodeBool,Object.class);
Boolean returnValBool = (Boolean) objectBool;
System.err.println(returnValBool);
JsonNode nodeDouble = new DoubleNode(3.4);
Object objectDouble = mapper.convertValue(nodeDouble,Object.class);
Double returnValDouble = (Double) objectDouble;
System.err.println(returnValDouble);
它按预期结束:
true
3.4
标签:json,java,jackson
来源: https://codeday.me/bug/20190527/1165778.html