<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • 如何優雅解析多層嵌套的復雜JSON數據

    我們在平時開發中經常會涉及調用某個REST接口從而獲取對應數據的情況,在這個過程中,返回的數據往往都是JSON數據,一般情況下,我們都會針對這些JSON數據定義對應實體類,從而獲取我們需要的數據。這種方式對于結構簡單的JSON數據是OK的,但是如果遇到下面這種多級嵌套的數據就比較蛋疼了:

    {
      "a1":{
        "b1":{
          "c1":{
            "d1":"d1"
          }
        }
      },
      "a2":{
        "b2":{
          "c2":{
            "d2":["i1","i2","i3"]
          }
        }
      }
    }

    那么對于這種情況,有沒有比較優雅的處理方式呢?

     

    一、什么是OGNL表達式

    OGNL全稱 “對象圖導航語言”,我們可以使用其提供的表達式語言獲取JAVA對象樹中的任意屬性或調用其方法。不僅如此,它還能自動實現必要的類型轉換,廢話不多說,我們來看看如何使用吧。

     

    二、如何使用

    1、首先引入所需的maven依賴,主要包括jackson和ognl:

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.11.4</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.11.4</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.11.4</version>
    </dependency>
            
    <dependency>
      <groupId>ognl</groupId>
      <artifactId>ognl</artifactId>
      <version>3.1.26</version>
    </dependency>

    2、封裝JSON反序列化與數據提取的方法

    我們封裝兩個方法:

    • parse:將JSON數據反序列化為Map對象

    • getValue:使用OGNL表達式從Map中提取數據

    public class JsonUtils {
        private static Logger logger = Logger.getLogger("JsonUtils");
    
        private final static ObjectMapper objectMapper = new ObjectMapper();
        public static ObjectMapper getInstance() {
            return objectMapper;
        }
    
        public static <T> T parse(String jsonStr, Class<T> clazz) throws Exception {
            return getInstance().readValue(jsonStr, clazz);
        }
    
        public static <T> T getValue(Map map, String path, Class<T> klass) throws Exception {
            OgnlContext ctx = new OgnlContext();
            ctx.setRoot(map);
            T value = (T) Ognl.getValue(path, ctx, ctx.getRoot());
            return value;
        }
    }

    3、測試

    public class Demo {
    
        public static void main(String[] args) throws Exception{
            String jsonData = "{\"a1\":{\"b1\":{\"c1\":{\"d1\":\"d1\"}}},\"a2\":{\"b2\":{\"c2\":{\"d2\":[\"i1\",\"i2\",\"i3\"]}}}}";
    
            Map<String, Object> map = JsonUtils.parse(jsonData, Map.class);
    
            String s = JsonUtils.getValue(map, "a1.b1.c1.d1", String.class);
            System.out.println(s);
    
            List<String> list = JsonUtils.getValue(map, "a2.b2.c2.d2", List.class);
            System.out.println(list);
        }
    }

    我們就以開篇展示的多層JSON數據為例進行演示,其中"a1.b1.c1.d1"將取到值為“d1”的字符串數據,“a2.b2.c2.d2”將取到一個列表,運行代碼,我們可得到如下結果:

    d1
    [i1, i2, i3]

     

    三、小結

    我們通過Demo可以看到,使用Ognl表達式可以使我們代碼變得更加精煉,避免構造各種復雜實體類的尷尬,關于OGNL的更多用法,小伙伴們可以自行學習。

    posted @ 2022-05-29 14:01  阿拉懶神燈  閱讀(36)  評論(0編輯  收藏  舉報
    国产美女a做受大片观看