我需要将 java 对象转换为 Map<String, String>
对于我正在编写的 REST api 包装器。任何复杂对象的字段都需要序列化为 json。我想出了如何做到这一点:
public static Map<String, String> toContentMap(Object object) throws JsonProcessingException {
Map<String, Object> objectParamMap = MAPPER.convertValue(object, new TypeReference<Map<String, Object>>() {});
Map<String, String> contentMap = new HashMap<>();
for (Entry<String, Object> entry : objectParamMap.entrySet()) {
String key = entry.getKey();
String value = MAPPER.writeValueAsString(entry.getValue());
contentMap.put(key, StringUtils.strip(value, "\""));
}
return contentMap;
}
现在我需要一种方法来从这个Map<String, String>
表示回到 pojo 对象。这可能主要使用 jackson api 吗?
编辑:
我想我没说清楚。我知道我要去/来自的 POJO。但它应该是通用的并且适用于任何基本的 POJO。
一个例子:
class MyObject {
String fieldA;
Long fieldB;
MyOtherObject fieldC;
List<String> fieldD;
}
class MyOtherObject {
String fieldA;
String fieldB;
}
MyObject object = new MyObject("valueA", 20L,
new MyOtherObject("valueA", "valueB"),
Lists.newArrayList("array1", "array2"));
Map<String, String> contentMap = toContentMap(object);
/*
"fieldA" -> "valueA"
"fieldB" -> "20"
"fieldC" -> "{\"fieldA\":\"valueA\",\"fieldB\":\"valueB\"}"
"fieldD" -> "[\"array1\",\"array2\"]"
*/
MyObject newObject = fromContentMap(contentMap);
assertEquals(object, newObject)
最佳答案
根据您的评论
it should work for any POJO I ask it to
我认为你正在寻找 @JsonAnyGetter
和 @JsonAnySetter
注释,它们会将它可以分配给 POJO 的值(你需要在反序列化时指定......它不能是通用的),但会坚持任何不是解析为 Map<String, Object>
。
请注意,它不能是 Map<String, String>
,因为 JSON 不仅仅包含字符串作为其值。
以JSON为例
{
"uid": 1,
"username": "steve",
"email": "steve@example.com"
}
你可以 generate a Jackson POJO 看起来像这样。
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"uid",
"username",
"email"
})
public class User {
@JsonProperty("uid")
private Integer uid;
@JsonProperty("username")
private String username;
@JsonProperty("email")
private String email;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonProperty("uid")
public Integer getUid() {
return uid;
}
@JsonProperty("uid")
public void setUid(Integer uid) {
this.uid = uid;
}
@JsonProperty("username")
public String getUsername() {
return username;
}
@JsonProperty("username")
public void setUsername(String username) {
this.username = username;
}
@JsonProperty("email")
public String getEmail() {
return email;
}
@JsonProperty("email")
public void setEmail(String email) {
this.email = email;
}
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
}
关于java - 如何使用 jackson 将具有 json 值的 Map<String, String> 转换为 POJO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35997028/