¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.springblade.core.mongo.utils; |
| | | |
| | | import com.fasterxml.jackson.databind.JsonNode; |
| | | import com.fasterxml.jackson.databind.node.ObjectNode; |
| | | |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * å¤ç mongo json æ°æ®ç»æ |
| | | * |
| | | * @author L.cm |
| | | */ |
| | | public class MongoJsonUtils { |
| | | |
| | | /** |
| | | * è·åææçå¶åèç¹åè·¯å¾ä¿¡æ¯ |
| | | * |
| | | * @param jsonNode jsonTree |
| | | * @return treeå¶åä¿¡æ¯ |
| | | */ |
| | | public static List<JsonNodeInfo> getLeafNodes(JsonNode jsonNode) { |
| | | if (jsonNode == null || !jsonNode.isObject()) { |
| | | return Collections.emptyList(); |
| | | } |
| | | List<JsonNodeInfo> list = new ArrayList<>(); |
| | | // ååçéå Deque ä»£æ¿ Stackï¼Stack æ§è½ä¸å¥½ |
| | | LinkedList<String> deque = new LinkedList<>(); |
| | | // éå½è·åå¶å ððð èç¹ |
| | | getLeafNodes(jsonNode, null, deque, list); |
| | | return list; |
| | | } |
| | | |
| | | private static void getLeafNodes(JsonNode jsonNode, JsonNode parentNode, LinkedList<String> deque, List<JsonNodeInfo> list) { |
| | | Iterator<Map.Entry<String, JsonNode>> iterator; |
| | | if (parentNode == null) { |
| | | iterator = jsonNode.fields(); |
| | | } else { |
| | | iterator = parentNode.fields(); |
| | | } |
| | | // tree åèç¹ |
| | | while (iterator.hasNext()) { |
| | | Map.Entry<String, JsonNode> entry = iterator.next(); |
| | | String fieldName = entry.getKey(); |
| | | JsonNode nextNode = entry.getValue(); |
| | | // 妿䏿¯å¼èç¹ |
| | | if (nextNode.isObject()) { |
| | | // æ·»å å°éåå°¾ï¼å
è¿å
åº |
| | | deque.addLast(fieldName); |
| | | getLeafNodes(parentNode, nextNode, deque, list); |
| | | } |
| | | // 妿æ¯å¼èç¹ï¼ä¹å°±æ¯å°å¶åèç¹äºï¼åå¶åèç¹ä¸çº§å³å¯ |
| | | if (nextNode.isValueNode()) { |
| | | // å°è£
èç¹å表 |
| | | LinkedList<String> elements = new LinkedList<>(deque); |
| | | // tree ç å¶åèç¹ï¼æ¤å¤ä¸ºå¼ç¨ |
| | | list.add(new JsonNodeInfo(elements, parentNode)); |
| | | break; |
| | | } |
| | | // æ é空æ¶å¼¹åº |
| | | if (!deque.isEmpty()) { |
| | | deque.removeLast(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æå»ºæ å½¢èç¹ |
| | | * |
| | | * @param jsonNode ç¶çº§èç¹ |
| | | * @param elements treeèç¹å表 |
| | | * @return JsonNode å¶åèç¹ï¼è¿åç¨äºå¡æ°æ® |
| | | */ |
| | | public static ObjectNode buildNode(ObjectNode jsonNode, List<String> elements) { |
| | | ObjectNode newNode = jsonNode; |
| | | for (String element : elements) { |
| | | // 妿已ç»åå¨èç¹ï¼è¿ä¸çææ°ç |
| | | if (newNode.has(element)) { |
| | | newNode = (ObjectNode) newNode.get(element); |
| | | } else { |
| | | newNode = newNode.putObject(element); |
| | | } |
| | | } |
| | | return newNode; |
| | | } |
| | | |
| | | /** |
| | | * è·åææ ððð èç¹çå¼ï¼å¹¶æå»ºæ mongodb update è¯å¥ |
| | | * @param prefix åç¼ |
| | | * @param nodeKeys mongo keys |
| | | * @param objectNode tree ð èç¹ |
| | | * @return tree èç¹ä¿¡æ¯ |
| | | */ |
| | | public static Map<String, Object> getAllUpdate(String prefix, String nodeKeys, ObjectNode objectNode) { |
| | | Map<String, Object> values = new HashMap<>(8); |
| | | Iterator<String> iterator = objectNode.fieldNames(); |
| | | while (iterator.hasNext()) { |
| | | String fieldName = iterator.next(); |
| | | JsonNode valueNode = objectNode.get(fieldName); |
| | | if (valueNode.isValueNode()) { |
| | | Object value; |
| | | if (valueNode.isShort()) { |
| | | value = valueNode.shortValue(); |
| | | } else if (valueNode.isInt()) { |
| | | value = valueNode.intValue(); |
| | | } else if (valueNode.isLong()) { |
| | | value = valueNode.longValue(); |
| | | } else if (valueNode.isBoolean()) { |
| | | value = valueNode.booleanValue(); |
| | | } else if (valueNode.isFloat()) { |
| | | value = valueNode.floatValue(); |
| | | } else if (valueNode.isDouble()) { |
| | | value = valueNode.doubleValue(); |
| | | } else if (valueNode.isMissingNode()) { |
| | | value = null; |
| | | } else { |
| | | value = valueNode.textValue(); |
| | | } |
| | | if (value != null) { |
| | | String valueKey = prefix + '.' + nodeKeys + '.' + fieldName; |
| | | values.put(valueKey, value); |
| | | } |
| | | } |
| | | } |
| | | return values; |
| | | } |
| | | } |