我一直在看杰克逊,但似乎我必须将地图转换为JSON,然后将结果JSON转换为POJO。
是否有方法将Map直接转换为POJO?
我一直在看杰克逊,但似乎我必须将地图转换为JSON,然后将结果JSON转换为POJO。
是否有方法将Map直接转换为POJO?
当前回答
杰克逊也能做到这一点。(而且自从你考虑使用jackson后,它似乎更舒服)。
使用ObjectMapper的convertValue方法:
final ObjectMapper mapper = new ObjectMapper(); // jackson's objectmapper
final MyPojo pojo = mapper.convertValue(map, MyPojo.class);
不需要转换成JSON字符串或其他东西;直接转换要快得多。
其他回答
到目前为止,使用Jackson提供的答案是很好的,但是你仍然可以有一个util函数来帮助你转换不同的pojo,如下所示:
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;
}
与Gson的解决方案:
Gson gson = new Gson();
JsonElement jsonElement = gson.toJsonTree(map);
MyPojo pojo = gson.fromJson(jsonElement, MyPojo.class);
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的所有属性转换为类。我还找到了objectmap .configure(反序列化特性。FAIL_ON_UNKNOWN_PROPERTIES、假);作为解决方案。
杰克逊也能做到这一点。(而且自从你考虑使用jackson后,它似乎更舒服)。
使用ObjectMapper的convertValue方法:
final ObjectMapper mapper = new ObjectMapper(); // jackson's objectmapper
final MyPojo pojo = mapper.convertValue(map, MyPojo.class);
不需要转换成JSON字符串或其他东西;直接转换要快得多。
将Map转换为POJO的例子。注意Map键包含下划线,字段变量是驼峰。
用户阶层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;
}
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)
*/