ValueNode
Jackson中的所有子类(JSON库)具有用于获取基础值对象的不同方法,例如IntNode
has getIntValue
,BooleanNode
has getBooleanValue
等。
为什么会出现简单地称为没有通用/多态的方法getValue
刚刚返回Object
凡属Object
要么Integer
还是Boolean
等的基础上,该方法被称为对节点的类型?
还是……实际上有这种方法吗?我出于目的需要这种方法,但是似乎库设计人员并未发现添加这种方法会很有用。还是……出于某种原因故意丢失了该方法?
我的目的:在下面,我遍历树并生成一个唯一的组成结构的代码HashMap
,Object[]
和Java的基本类型(如Integer
,Boolean
等)。如果我有这样的方法,那么我将只调用一个方法(而不是所有的if-else if-else if块)(如果the JsonNode
是叶节点,即的子类型ValueNode
)。但是看来杰克逊没有这种方法。因此,我必须对所有这些丑陋的if-else if-else if块进行编码。
码:
@SuppressWarnings({ "rawtypes", "unchecked" })
private static Object traverse(JsonNode nd) {
if (nd instanceof ObjectNode) {
ObjectNode ndd = (ObjectNode) nd;
HashMap mp = new HashMap();
Iterator<String> 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() + " |||");
}
Run Code Online (Sandbox Code Playgroud)
由于您要返回,因此Object
您可以使用类似这样的内容
ObjectMapper mapper = new ObjectMapper();
return mapper.convertValue(nd,Object.class);
Run Code Online (Sandbox Code Playgroud)
对于这个特定的测试用例,它起作用了
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);
Run Code Online (Sandbox Code Playgroud)
并按预期输出:
true
3.4
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
895 次 |
最近记录: |