我一直在看 Jackson ,但似乎我必须将Map转换为JSON,然后将生成的JSON转换为POJO .
有没有办法将Map直接转换为POJO?
嗯,你也可以和 Jackson 一起实现 . (因为你考虑使用 Jackson ,它似乎更舒服) .
使用 ObjectMapper 的convertValue方法:
ObjectMapper
final ObjectMapper mapper = new ObjectMapper(); // jackson's objectmapper final MyPojo pojo = mapper.convertValue(map, MyPojo.class);
无需转换为JSON字符串或其他内容;直接转换的速度要快得多 .
Gson的解决方案:
Gson gson = new Gson(); JsonElement jsonElement = gson.toJsonTree(map); MyPojo pojo = gson.fromJson(jsonElement, MyPojo.class);
我测试了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)); }}
是的,它绝对可以避免中间转换为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> 只能获得一个级别) .
Map<String, Object>
Map<String, String>
4 回答
嗯,你也可以和 Jackson 一起实现 . (因为你考虑使用 Jackson ,它似乎更舒服) .
使用
ObjectMapper
的convertValue方法:无需转换为JSON字符串或其他内容;直接转换的速度要快得多 .
Gson的解决方案:
我测试了Jackson和BeanUtils,发现BeanUtils要快得多 .
在我的机器(Windows8.1,JDK1.7)中,我得到了这个结果 .
是的,它绝对可以避免中间转换为JSON . 使用像Dozer这样的深层复制工具,您可以将 Map 直接转换为POJO . 这是一个简单的例子:
示例POJO:
示例转换代码:
输出:
注意:如果您将源 Map 更改为
Map<String, Object>
,则可以复制任意深度嵌套属性(使用Map<String, String>
只能获得一个级别) .