小技巧:Json映射為Map,避免定義過多pojo類

我們在開發(fā)過程中經(jīng)常會遇到解析Json字符串的情況,這時候采用開源工具可以快速將json字符串映射為pojo對象。而在某些業(yè)務(wù)場景中,往往為了獲得json字符串中某個屬性的值而不得不定義一個pojo類,從而形成與json字符串的對應(yīng)。一旦json格式發(fā)生改變。pojo類也不得不作相應(yīng)修改。
這時候可以考慮將json與Map映射。只要知道具體的屬性名即可獲取屬性值。

假設(shè)有如下Json字符串

{
    "id": 100,
    "name": "scott",
    "birthday": 1480785217693,
    "org": {
    "id": 1,
    "name": "銷售部"
    }
}

由于Json格式都是鍵值對形式存在,所以直接映射Map類型即可。這里采用Gson作為Json解析工具。

Gson gson = new GsonBuilder().create();

String json = "{\"id\":100,\"name\":\"scott\",\"birthday\":\"Dec 4, 2016 1:10:33 AM\",\"org\":{\"id\":1,\"name\":\"銷售部\"}}";

Map map = gson.fromJson(json, Map.class);

如何取值?傳統(tǒng)循環(huán)方式

這里用.作為屬性名之間的分隔符。

  • 定義解析Map的方法
      private <T> T getValueByMap(String path,Map<String, Object> map,Class<T> clazz,Object defaultVal){
      
          String[] params = path.split("\\.");
          for(int i=0;i<params.length-1;i++){
              map = (Map)map.get(params[i]);
          }
          Object result = null;
          result = map.get(params[params.length-1]);
    
          return result == null ? (T) defaultVal : (T) result;
      }
    
  • 調(diào)用上述方法
      String name = getValueByMap("org.name",map,String.class,"");
      System.out.println(name);
          
      double birthday = getValueByMap("birthday",map,double.class,"");
      System.out.println(new Double(birthday).longValue());
    

Ognl方式,采用該方式需引入Ognl依賴

<dependency>
    <groupId>ognl</groupId>
    <artifactId>ognl</artifactId>
    <version>3.1.12</version>
</dependency>
代碼實現(xiàn)
private <T> T getValueByMap(String path, Map<String, Object> map, Class<T> clazz, Object defaultVal) throws OgnlException {

    OgnlContext context = new OgnlContext();
    context.putAll(map);
    Object value = Ognl.getValue(path, context);
    return value == null ? (T) defaultVal : (T) value;
}

Json數(shù)組處理

假設(shè)json字符串如下:

{
    "id": 1,
    "name": "銷售部",
        "empSet": [
        {
            "id": 2,
            "name": "scott 2",
            "birthday": 1480787444646
        },
        {
            "id": 3,
                "name": "scott 3",
            "birthday": 1480787444646
        },
        {
            "id": 4,
            "name": "scott 4",
            "birthday": 1480787444646
        },
        {
            "id": 0,
            "name": "scott 0",
            "birthday": 1480787444646
        },
        {
            "id": 1,
            "name": "scott 1",
            "birthday": 1480787444646
        }
    ]
}
  • 用List與Json字符串中的數(shù)組部門映射即可。
      Gson gson = new GsonBuilder().create();
    
      String json = "{\"id\":1,\"name\":\"銷售部\",\"empSet\":[{\"id\":2,\"name\":\"scott 2\",\"birthday\":1480787444646},{\"id\":3,\"name\":\"scott 3\",\"birthday\":1480787444646},{\"id\":4,\"name\":\"scott 4\",\"birthday\":1480787444646},{\"id\":0,\"name\":\"scott 0\",\"birthday\":1480787444646},{\"id\":1,\"name\":\"scott 1\",\"birthday\":1480787444646}]}";
    
      Map map = gson.fromJson(json, Map.class);
    
      List emps = getValueByMap("empSet", map, List.class, "");
      System.out.println(emps);
    

另外在解析json過程中,盡量使用double映射數(shù)字類型(包括整形與浮點型),后續(xù)再進(jìn)行類型轉(zhuǎn)換即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,533評論 19 139
  • 1.概述2.Gson的目標(biāo)3.Gson的性能和擴(kuò)展性4.Gson的使用者5.如何使用Gson 通過Maven來使用...
    人失格閱讀 14,547評論 2 18
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,637評論 18 399
  • 1 反射機(jī)制&JSON解析 【 Java的高級特性:反射機(jī)制 publicclass Student { pu...
    征程_Journey閱讀 1,006評論 0 0
  • 這段文字的靈感來源是來自近期的一次面試,過來面試的是一位剛剛從某知名二線互聯(lián)網(wǎng)公司離職的客戶端產(chǎn)品經(jīng)理,兩年半經(jīng)驗...
    老鄧V閱讀 246評論 0 0

友情鏈接更多精彩內(nèi)容