首页 文章

将Map <String,String>转换为POJO

提问于
浏览
107

我一直在看 Jackson ,但似乎我必须将Map转换为JSON,然后将生成的JSON转换为POJO .

有没有办法将Map直接转换为POJO?

4 回答

  • 212

    嗯,你也可以和 Jackson 一起实现 . (因为你考虑使用 Jackson ,它似乎更舒服) .

    使用 ObjectMapperconvertValue方法:

    final ObjectMapper mapper = new ObjectMapper(); // jackson's objectmapper
    final MyPojo pojo = mapper.convertValue(map, MyPojo.class);
    

    无需转换为JSON字符串或其他内容;直接转换的速度要快得多 .

  • 32

    Gson的解决方案:

    Gson gson = new Gson();
    JsonElement jsonElement = gson.toJsonTree(map);
    MyPojo pojo = gson.fromJson(jsonElement, MyPojo.class);
    
  • 6

    我测试了Jackson和BeanUtils,发现BeanUtils要快得多 .
    在我的机器(Windows8.1,JDK1.7)中,我得到了这个结果 .

    BeanUtils t2-t1 = 286
    Jackson t2-t1 = 2203
    
    public class MainMapToPOJO {
    
    public static final int LOOP_MAX_COUNT = 1000;
    
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        map.put("success", true);
        map.put("data", "testString");
    
        runBeanUtilsPopulate(map);
    
        runJacksonMapper(map);
    }
    
    private static void runBeanUtilsPopulate(Map<String, Object> map) {
        long t1 = System.currentTimeMillis();
        for (int i = 0; i < LOOP_MAX_COUNT; i++) {
            try {
                TestClass bean = new TestClass();
                BeanUtils.populate(bean, map);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
        long t2 = System.currentTimeMillis();
        System.out.println("BeanUtils t2-t1 = " + String.valueOf(t2 - t1));
    }
    
    private static void runJacksonMapper(Map<String, Object> map) {
        long t1 = System.currentTimeMillis();
        for (int i = 0; i < LOOP_MAX_COUNT; i++) {
            ObjectMapper mapper = new ObjectMapper();
            TestClass testClass = mapper.convertValue(map, TestClass.class);
        }
        long t2 = System.currentTimeMillis();
        System.out.println("Jackson t2-t1 = " + String.valueOf(t2 - t1));
    }}
    
  • 3

    是的,它绝对可以避免中间转换为JSON . 使用像Dozer这样的深层复制工具,您可以将 Map 直接转换为POJO . 这是一个简单的例子:

    示例POJO:

    public class MyPojo implements Serializable {
        private static final long serialVersionUID = 1L;
    
        private String id;
        private String name;
        private Integer age;
        private Double savings;
    
        public MyPojo() {
            super();
        }
    
        // Getters/setters
    
        @Override
        public String toString() {
            return String.format(
                    "MyPojo[id = %s, name = %s, age = %s, savings = %s]", getId(),
                    getName(), getAge(), getSavings());
        }
    }
    

    示例转换代码:

    public class CopyTest {
        @Test
        public void testCopyMapToPOJO() throws Exception {
            final Map<String, String> map = new HashMap<String, String>(4);
            map.put("id", "5");
            map.put("name", "Bob");
            map.put("age", "23");
            map.put("savings", "2500.39");
            map.put("extra", "foo");
    
            final DozerBeanMapper mapper = new DozerBeanMapper();
            final MyPojo pojo = mapper.map(map, MyPojo.class);
            System.out.println(pojo);
        }
    }
    

    输出:

    MyPojo [id = 5,name = Bob,年龄= 23,储蓄= 2500.39]

    注意:如果您将源 Map 更改为 Map<String, Object> ,则可以复制任意深度嵌套属性(使用 Map<String, String> 只能获得一个级别) .

相关问题