맵 을 POJO로 변환하다
Jackson을 보고 있는데, Map을 JSON으로 변환하고 그 결과 JSON을 POJO로 변환해야 할 것 같습니다.
지도를 POJO로 직접 변환할 수 있는 방법이 있습니까?
잭슨도 할 수 있을 것 같아요(그리고 잭슨을 사용하는 것을 생각하고 있었기 때문에 더 편해진 것 같습니다).
사용하다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);
만약 당신이 당신의 클래스에 범용 타입을 가지고 있다면 당신은 그것을 사용해야 한다.TypeReference
와 함께convertValue()
.
final ObjectMapper mapper = new ObjectMapper();
final MyPojo<MyGenericType> pojo = mapper.convertValue(map, new TypeReference<MyPojo<MyGenericType>>() {});
또한 그것을 사용하여 pojo를 다음과 같이 변환할 수 있습니다.java.util.Map
뒤로.
final ObjectMapper mapper = new ObjectMapper();
final Map<String, Object> map = mapper.convertValue(pojo, new TypeReference<Map<String, Object>>() {});
ObjectMapper objectMapper = new ObjectMapper();
// Use this if all properties are not in the class
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
final MyPojo pojo = objectMapper.convertValue(map, MyPojo.class);
첫 번째 답변과 동일하지만 Map의 모든 속성을 클래스로 변환하지 않기 때문에 사용 중 오류가 발생했습니다.나도 찾았어objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
해결책으로 삼을 수 있습니다.
네, 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>
레벨은 1개뿐입니다).
Jackson과 Bean Utils를 모두 테스트한 결과 Bean Utils가 훨씬 더 빠르다는 것을 알게 되었습니다.
제 컴퓨터(Windows 8.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));
}}
Jackson을 사용하여 지금까지 제공된 답변은 매우 좋지만, 여전히 다른 변환에 도움이 되는 util 함수를 사용할 수 있습니다.POJO
s는 다음과 같습니다.
public static <T> T convert(Map<String, Object> aMap, Class<T> t) {
try {
return objectMapper
.convertValue(aMap, objectMapper.getTypeFactory().constructType(t));
} catch (Exception e) {
log.error("converting failed! aMap: {}, class: {}", getJsonString(aMap), t.getClass().getSimpleName(), e);
}
return null;
}
맵을 POJO로 변환합니다.Map 키에는 밑줄이 포함되어 필드 변수는 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;
}
App.class가 예를 테스트합니다.
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)
*/
@Hamedz는 많은 데이터를 사용하는 경우 잭슨을 사용하여 광데이터를 변환하고 Apache를 사용합니다.테스트 케이스:
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
public class TestPerf {
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("number", 1000);
map.put("longer", 1000L);
map.put("doubler", 1000D);
map.put("data1", "testString");
map.put("data2", "testString");
map.put("data3", "testString");
map.put("data4", "testString");
map.put("data5", "testString");
map.put("data6", "testString");
map.put("data7", "testString");
map.put("data8", "testString");
map.put("data9", "testString");
map.put("data10", "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));
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class TestClass {
private Boolean success;
private Integer number;
private Long longer;
private Double doubler;
private String data1;
private String data2;
private String data3;
private String data4;
private String data5;
private String data6;
private String data7;
private String data8;
private String data9;
private String data10;
}
}
언급URL : https://stackoverflow.com/questions/16428817/convert-a-mapstring-string-to-a-pojo
'programing' 카테고리의 다른 글
워드프레스 테마 개발에 관한 자원 (0) | 2023.02.23 |
---|---|
스프링 데이터 MongoRepository 저장(T)이 작동하지 않습니다...가끔씩 (0) | 2023.02.23 |
javascript를 사용하여 html을 생성하는 모범 사례가 있습니까? (0) | 2023.02.23 |
워드프레스 $wpdb.여러 레코드 삽입 (0) | 2023.02.23 |
각도 JS $timeout vs $interval (0) | 2023.02.23 |