Merging Two JSON Documents Using Jackson

前端 未结 6 2247
有刺的猬
有刺的猬 2020-11-29 22:51

Is it possible to merge two JSON documents with the Jackson JSON library? I am basically using the Jackson mapper with simple Java Maps.

I\'ve tried to search in Goo

6条回答
  •  星月不相逢
    2020-11-29 23:45

    Here,is full implementation of merging two JSON tree into one. Hope it would be helpful :)

    /**
     * Merge two JSON tree into one i.e mergedInTo.
     *
     * @param toBeMerged
     * @param mergedInTo
     */
    public static void merge(JsonNode toBeMerged, JsonNode mergedInTo) {
        Iterator> incomingFieldsIterator = toBeMerged.fields();
        Iterator> mergedIterator = mergedInTo.fields();
    
        while (incomingFieldsIterator.hasNext()) {
            Map.Entry incomingEntry = incomingFieldsIterator.next();
    
            JsonNode subNode = incomingEntry.getValue();
    
            if (subNode.getNodeType().equals(JsonNodeType.OBJECT)) {
                boolean isNewBlock = true;
                mergedIterator = mergedInTo.fields();
                while (mergedIterator.hasNext()) {
                    Map.Entry entry = mergedIterator.next();
                    if (entry.getKey().equals(incomingEntry.getKey())) {
                        merge(incomingEntry.getValue(), entry.getValue());
                        isNewBlock = false;
                    }
                }
                if (isNewBlock) {
                    ((ObjectNode) mergedInTo).replace(incomingEntry.getKey(), incomingEntry.getValue());
                }
            } else if (subNode.getNodeType().equals(JsonNodeType.ARRAY)) {
                boolean newEntry = true;
                mergedIterator = mergedInTo.fields();
                while (mergedIterator.hasNext()) {
                    Map.Entry entry = mergedIterator.next();
                    if (entry.getKey().equals(incomingEntry.getKey())) {
                        updateArray(incomingEntry.getValue(), entry);
                        newEntry = false;
                    }
                }
                if (newEntry) {
                    ((ObjectNode) mergedInTo).replace(incomingEntry.getKey(), incomingEntry.getValue());
                }
            }
            ValueNode valueNode = null;
            JsonNode incomingValueNode = incomingEntry.getValue();
            switch (subNode.getNodeType()) {
                case STRING:
                    valueNode = new TextNode(incomingValueNode.textValue());
                    break;
                case NUMBER:
                    valueNode = new IntNode(incomingValueNode.intValue());
                    break;
                case BOOLEAN:
                    valueNode = BooleanNode.valueOf(incomingValueNode.booleanValue());
            }
            if (valueNode != null) {
                updateObject(mergedInTo, valueNode, incomingEntry);
            }
        }
    }
    
    private static void updateArray(JsonNode valueToBePlaced, Map.Entry toBeMerged) {
        toBeMerged.setValue(valueToBePlaced);
    }
    
    private static void updateObject(JsonNode mergeInTo, ValueNode valueToBePlaced,
                                     Map.Entry toBeMerged) {
        boolean newEntry = true;
        Iterator> mergedIterator = mergeInTo.fields();
        while (mergedIterator.hasNext()) {
            Map.Entry entry = mergedIterator.next();
            if (entry.getKey().equals(toBeMerged.getKey())) {
                newEntry = false;
                entry.setValue(valueToBePlaced);
            }
        }
        if (newEntry) {
            ((ObjectNode) mergeInTo).replace(toBeMerged.getKey(), toBeMerged.getValue());
        }
    }
    

提交回复
热议问题