Jackson-通用getValue方法

pet*_*rov 5 java json jackson

ValueNodeJackson中的所有子类(JSON库)具有用于获取基础值对象的不同方法,例如IntNodehas getIntValueBooleanNodehas getBooleanValue等。

为什么会出现简单地称为没有通用/多态的方法getValue刚刚返回Object凡属Object要么Integer还是Boolean等的基础上,该方法被称为对节点的类型?

还是……实际上有这种方法吗?我出于目的需要这种方法,但是似乎库设计人员并未发现添加这种方法会很有用。还是……出于某种原因故意丢失了该方法?

我的目的:在下面,我遍历树并生成一个唯一的组成结构的代码HashMapObject[]和Java的基本类型(如IntegerBoolean等)。如果我有这样的方法,那么我将只调用一个方法(而不是所有的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)

Rad*_*scu 5

由于您要返回,因此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)