java - 如何使用 jackson 将具有 json 值的 Map<String, String> 转换为 POJO?

标签 java jackson

我需要将 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/

相关文章:

java - JaxRS 和 Jackson 的多态性

java - jackson 无法识别的字段

java - 未找到扫描器类 java 文件

java - MediaRecorder : IOexception prepare failed error . 请帮助我

java - 我需要在 POJO 中反序列化具有多个类的复杂 JSON

java - 如何从具有不同字段的同一类创建两个 json 文件

jackson - java.io.IOException : UT010029: Stream is closed

java - 保存其元素可以稍后在利益相关者之间分配的元素的最佳数据结构?

java - docs.oracle.com lambda 表达式示例无法编译

Java 方法被调用,但元素未在 GUI 中显示