美文网首页程序员
小技巧:Json映射为Map,避免定义过多pojo类

小技巧:Json映射为Map,避免定义过多pojo类

作者: SamHxm | 来源:发表于2016-12-04 02:04 被阅读0次

我们在开发过程中经常会遇到解析Json字符串的情况,这时候采用开源工具可以快速将json字符串映射为pojo对象。而在某些业务场景中,往往为了获得json字符串中某个属性的值而不得不定义一个pojo类,从而形成与json字符串的对应。一旦json格式发生改变。pojo类也不得不作相应修改。
这时候可以考虑将json与Map映射。只要知道具体的属性名即可获取属性值。

假设有如下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);

如何取值?传统循环方式

这里用.作为属性名之间的分隔符。

  • 定义解析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;
      }
    
  • 调用上述方法
      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>
代码实现
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数组处理

假设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字符串中的数组部门映射即可。
      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映射数字类型(包括整形与浮点型),后续再进行类型转换即可。

相关文章

  • 小技巧:Json映射为Map,避免定义过多pojo类

    我们在开发过程中经常会遇到解析Json字符串的情况,这时候采用开源工具可以快速将json字符串映射为pojo对象。...

  • Hibernate(五)对象关系映射文件

    一、POJO 类和数据库的映射文件*.hbm.xml POJO 类和关系数据库之间的映射可以用一个XML文档来定义...

  • Gson的使用

    测试的pojo 需求 1.当pojo类中有int类型,但是前端获得的json数据为age为空的情况下 2.序列化时...

  • Mybatis05

    输入映射和输出映射 1、输入参数之POJO包装类 1.1、编写QueryVo 1.2 Us...

  • Map/LinkedHashMap/HashMap/Hashta

    Java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap, Has...

  • HashMap、HashTable、LinkedHashMap和

    Java为数据结构中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap、Hash...

  • 关于map 的几种方式

    java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是==HashMap Ha...

  • HashMap、Hashtable、LinkedHashMap、

    相同点 Java为数据结构中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap、...

  • HTML标签

    HTML 标签## 带有可点击区域的图像映射:定义一个客户端图像映射。图像映射(image-map)指...

  • Spring DATA JPA

    还没系统学习, 很像Hibernate POJO上加像Hibernate的注解映射映射实体和表 SQL语句定义3种...

网友评论

    本文标题:小技巧:Json映射为Map,避免定义过多pojo类

    本文链接:https://www.haomeiwen.com/subject/vufhmttx.html