带有转义属性的 JSON 到 Java 对象反序列化

use*_*133 6 java json jackson

我需要将以下 JSON 转换为 Java 对象。该物业providerResponse在JSON包含的属性的地图,但他们逃脱了,并包裹在双引号。因此,它不会将属性反序列providerResponse化为 Java 对象(它作为String)。我objectMapper.readValue(msgStr, classType)用来反序列化 JSON。该消息由 AWS 生成,用于 SNS 传送状态通知,我无法控制更改 JSON 消息。是否可以配置ObjectMapper为取消转义属性并反序列化为 Java 对象而不是String

{  
   "delivery":{  
      "providerResponse":"{\"sqsRequestId\":\"308ee0c6-7d51-57b0-a472-af8e6c41be0b\",\"sqsMessageId\":\"88dd59eb-c34d-4e4d-bb27-7e0d226daa2a\"}"
   }
}

@JsonProperty("providerResponse")
private String providerResponse;
Run Code Online (Sandbox Code Playgroud)

bla*_*ide 6

ObjectMapper默认情况下,似乎没有一种方法可以配置来处理此行为。解决方案是创建一个自定义JsonDeserializer

public class Wrapper {
    public Delivery delivery;
}

public class Delivery {
    @JsonDeserialize(using = ProviderResponseDeserializer.class)
    public ProviderResponse providerResponse;
}

public class ProviderResponse {
    public String sqsRequestId;
    public String sqsMessageId;
}

public class ProviderResponseDeserializer extends JsonDeserializer<ProviderResponse> {
    private static final ObjectMapper mapper = new ObjectMapper();

    @Override
    public ProviderResponse deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        return mapper.readValue(jsonParser.getText(), ProviderResponse.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下命令反序列化 JSON ObjectMapper

ObjectMapper mapper = new ObjectMapper();
Wrapper wrapper = mapper.readValue(JSON, Wrapper.class);
Run Code Online (Sandbox Code Playgroud)