首页 > 解决方案 > 使用 Jackson 将 json 字符串转换为通用 Map

问题描述

我从不同的服务获取以下对象,我需要将其解析为我的服务中的 POJO。传入的对象看起来像:AddressMessage.java

public class AddressMessage {

    @NotEmpty
    @JsonProperty("id")
    private String id;

    @NotEmpty
    @JsonProperty("address")
    private String address;

    public String getId() {
        return this.id;
    }

    public String getAddress() {
        return this.address;
    }

    @SuppressWarnings("unchecked")
    @JsonProperty("data")
    public void unpackNested(Map<String, Object> rawMessage) {
        Map<String, String> data = (Map<String, String>) rawMessage.get("data");
        this.id = (String) data.get("id");
        this.address = (String) data.get("address");
    }
}

传入的数据如下所示:

{“data”: { “id” : “sampleId”, “address”: “sampleAddress” }}

我尝试将传入的 json 字符串解析为普通对象,但这不起作用:

private void publishMessage(String rawMessage, AMQP.BasicProperties props) throws IOException {
        Object json = objectMapper.readValue(rawMessage, Object.class);
        log.debug(objectMapper.writeValueAsString(json));

我还尝试接收原始消息并使用对象映射器将其直接映射到类,如下所示:

private void publishMessage(String rawMessage, AMQP.BasicProperties props) throws IOException {
   AddressMessage addressMessage = objectMapper.readValue(rawMessage, 
   AddressMessage.class);
}

上述代码例外:

Unexpected character ('“' (code 8220 / 0x201c)): was expecting double-quote to start field name

我想从对象中提取“id”和“address”属性,但由于解析错误,我一直遇到异常。一些指导将不胜感激,谢谢!

另外:我目前没有使用“unpackNested”方法,但我想我会把它扔在那里以防它引发任何想法

标签: javajackson

解决方案


您可以@JsonCreator像这样在构造函数上使用注释:

@JsonCreator
public AddressMessage(@JsonProperty("data") Map<String, Object> rawJson) {
    this.id = rawJson.get("id").toString();
    this.address = rawJson.get("address").toString();
}

这告诉杰克逊在反序列化时使用该构造函数。


推荐阅读