getValue()方法 java_java – Jackson – 泛型getValue方法

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值