79
A
回答
160
那麼,你也可以用傑克遜來實現。 (因爲你正在考慮使用傑克遜似乎更舒服)。
使用ObjectMapper
的convertValue
方法:
final ObjectMapper mapper = new ObjectMapper(); // jackson's objectmapper
final MyPojo pojo = mapper.convertValue(map, MyPojo.class);
無需轉換成JSON字符串或別的東西;直接轉換的速度要快得多。
2
是的,它絕對有可能避免中間轉換爲JSON。使用像Dozer這樣的深層複製工具,您可以直接將地圖轉換爲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,名字=鮑勃,年齡= 23,儲蓄= 2500.39]
注意:如果將源地圖更改爲Map<String, Object>
,則可以複製任意深度的嵌套屬性(使用Map<String, String>
只能獲得一個級別)。
20
3
我已經測試了傑克遜和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));
}}
+0
區別在於:傑克遜擁有一個完整的類型轉換框架。例如'Map'包含'map.put(「data」,「2016-06-26」)並且'TestClass'有一個字段'private LocalDate data;',那麼Jackson將能夠完成任務,而BeanUtils將會失敗。 – 2016-06-26 10:00:44
相關問題
- 1. 如何將字符串xml轉換爲地圖<String,String>
- 2. 將hadoop的配置轉換爲地圖<String,String>
- 3. 將Java對象轉換爲Java地圖<String,Object>
- 4. C#將列表<string>轉換爲字典<string,string>
- 5. 如何將MultiMap <String,String>轉換爲MultiMap <String,Integer>?
- 6. 將Clojure的PersistentArrayMap強制轉換爲Java的地圖<String,String>
- 7. 將ArrayList <String>轉換爲字節[]
- 8. 將java.util.stream.Stream <String>轉換爲java.io.Reader
- 9. 將List <ApplicationInfo>轉換爲String []
- 10. 將enum轉換爲列表<string>
- 11. 將XmlNodeList轉換爲列表<string>
- 12. 將IDictionary <string,object>轉換爲類
- 13. 爪哇:如何將列表<?>轉換爲地圖<String,?>
- 14. 如何將HashMap <String,Integer> param轉換爲Map <String,Object)
- 15. 將ObjectResult <string>轉換爲ObjectModel.Collection <string>
- 16. Android將ArrayList <HashMap <String,String >> mylist轉換爲stringarray
- 17. 如何將List <NameValuePair>轉換爲hashMap <String,String>?
- 18. 將JavaDStream <String>轉換爲JavaRDD <String>
- 19. 將地圖[String,Iterator [Int]]轉換爲Iterator [Map [String,Int]]
- 20. 將jsonnode轉換爲pojo
- 21. 將JsonNode轉換爲POJO
- 22. 如何將String []轉換爲IDictionary <String,String>?
- 23. 轉換的ArrayList <String>爲String [] []
- 24. 將C#列表轉換爲<string>轉換爲Javascript
- 25. 不能隱式地將類型UnityEngine.Events.UnityAction <string>轉換爲UnityEngine.Events.UnityAction
- 26. 一個轉換POJO到<K,V>地圖
- 27. 將地圖<String,String>轉換爲列表<NameValuePair> - 這是最高效的嗎?
- 28. 如何將Collection <object>轉換爲ArrayList <Dictionary <string,string>>?
- 29. 如何將List <Single <String>>轉換爲列表<String>?
- 30. 將列表<Map <String,Object >>轉換爲Map <String,Integer>
你能提供這個庫的gradle命令嗎? – 2016-12-25 20:29:42
您需要包含此庫才能使用ObjectMapper'compile'com.fasterxml.jackson.core:jackson-databind:2.7.3'' – 2016-12-25 20:31:22
使用convertValue是正確答案,但不要每次都創建一個ObjectMapper實例。創建和線程安全代價很高,因此創建一個並將其緩存在某處。 – glade 2017-02-26 23:06:46