首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有转义属性的JSON对象反序列化

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

Stack Overflow用户
提问于 2016-04-06 21:47:41
回答 2查看 6K关注 0票数 7

我需要将以下JSON转换为Java对象。JSON中的属性providerResponse包含属性映射,但它们被转义并包装在doubleQuotes中。因此,它不会将属性providerResponse反序列化为Java (它是String)。我使用objectMapper.readValue(msgStr, classType)反序列化JSON。该消息由AWS为SNS传递状态通知生成,我没有控制来更改JSON消息。是否可以将ObjectMapper配置为取消转义属性并反序列化为String对象而不是String

代码语言:javascript
复制
{  
   "delivery":{  
      "providerResponse":"{\"sqsRequestId\":\"308ee0c6-7d51-57b0-a472-af8e6c41be0b\",\"sqsMessageId\":\"88dd59eb-c34d-4e4d-bb27-7e0d226daa2a\"}"
   }
}

@JsonProperty("providerResponse")
private String providerResponse;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-06 22:14:44

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

代码语言:javascript
复制
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);
    }
}

然后,可以使用ObjectMapper反序列化JSON

代码语言:javascript
复制
ObjectMapper mapper = new ObjectMapper();
Wrapper wrapper = mapper.readValue(JSON, Wrapper.class);
票数 8
EN

Stack Overflow用户

发布于 2017-07-10 07:18:59

我也面临着类似的问题。如果我们在ProviderResponse中定义一个构造函数,该构造函数接受一个字符串参数(实际上是json),然后将构造函数中的json映射到ProviderResponse实例,并使用这个临时实例初始化属性,那么这个问题就会得到解决。

代码语言:javascript
复制
public class Wrapper {
    public Delivery delivery;
}

public class Delivery {
    public ProviderResponse providerResponse;
}

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

    private static ObjectMapper objMapper = new ObjectMapper();

    public ProviderResponse(String json) {
        ProviderResponse temp = objMapper.readValue(json, ProviderResponse.class);
        this.sqsMessageId = temp.sqsMessageId;
        this.sqsRequestId = temp.sqsRequestId;
    }
}

关键是将ObjectMapper实例及其使用保存在实用程序类中的某个位置,并从那里使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36462971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档