지도 변환 POJO에게
잭슨을보고 있었지만 Map을 JSON으로 변환 한 다음 결과 JSON을 POJO로 변환해야합니다.
지도를 POJO로 직접 변환하는 방법이 있습니까?
음, 잭슨도 그렇게 할 수 있습니다. (그리고 잭슨 사용을 고려한 이후로 더 편안해 보입니다).
ObjectMapper
의 convertValue
방법을 사용하십시오 .
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));
}}
Yes, its definitely possible to avoid the intermediate conversion to JSON. Using a deep-copy tool like Dozer you can convert the map directly to a POJO. Here is a simplistic example:
Example 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());
}
}
Sample conversion code:
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);
}
}
Output:
MyPojo[id = 5, name = Bob, age = 23, savings = 2500.39]
Note: If you change your source map to a Map<String, Object>
then you can copy over arbitrarily deep nested properties (with Map<String, String>
you only get one level).
if you have generic types in your class you should use TypeReference
with convertValue()
.
final ObjectMapper mapper = new ObjectMapper();
final MyPojo<MyGenericType> pojo = mapper.convertValue(map, new TypeReference<MyPojo<MyGenericType>>() {});
Also you can use that to convert a pojo to java.util.Map
back.
final ObjectMapper mapper = new ObjectMapper();
final Map<String, Object> map = mapper.convertValue(pojo, new TypeReference<Map<String, Object>>() {});
convert Map to POJO example.Notice the Map key contains underline and field variable is hump.
User.class POJO
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class User {
@JsonProperty("user_name")
private String userName;
@JsonProperty("pass_word")
private String passWord;
}
The App.class test the example
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
public class App {
public static void main(String[] args) {
Map<String, String> info = new HashMap<>();
info.put("user_name", "Q10Viking");
info.put("pass_word", "123456");
ObjectMapper mapper = new ObjectMapper();
User user = mapper.convertValue(info, User.class);
System.out.println("-------------------------------");
System.out.println(user);
}
}
/**output
-------------------------------
User(userName=Q10Viking, passWord=123456)
*/
참고URL : https://stackoverflow.com/questions/16428817/convert-a-mapstring-string-to-a-pojo
'programing tip' 카테고리의 다른 글
가장 컴팩트 한 매핑을 만드는 방법 n → isprime (n) 최대 한계 N? (0) | 2020.06.14 |
---|---|
열거 형에서 임의의 값을 선택 하시겠습니까? (0) | 2020.06.14 |
TabControl에서 TabPage를 숨기는 방법 (0) | 2020.06.14 |
여러 인수를 가진 --build-arg로 docker build (0) | 2020.06.14 |
사용 된 Java 힙 크기 및 메모리를 찾는 명령 줄 도구 (Linux)? (0) | 2020.06.14 |