xiejun
2024-11-01 80b6cbfc9c861469146318d0b3dd5f8b8b525b8a
Source/BladeX-Tool/blade-starter-mongo/src/main/java/org/springblade/core/mongo/utils/MongoJsonUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,126 @@
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;
   }
}