Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ObjectMapper映射修剪后的响应或包装获得的响应_Java_Json_Pojo_Objectmapper - Fatal编程技术网

Java 使用ObjectMapper映射修剪后的响应或包装获得的响应

Java 使用ObjectMapper映射修剪后的响应或包装获得的响应,java,json,pojo,objectmapper,Java,Json,Pojo,Objectmapper,详细信息-- api响应的一个POJOSomeResponseObject具有属性 @JsonProperty("s_summary") private Map<String, SummaryObject> summary 我们的服务进一步修改了此POJO(json),以返回如下响应: { "rewardSubscription": { "accountId": "XYZ", "startDate": "2015-12-29T19:00:00+05:30"

详细信息--

api响应的一个POJO
SomeResponseObject
具有属性

@JsonProperty("s_summary")
private Map<String, SummaryObject> summary 
我们的服务进一步修改了此POJO(json),以返回如下响应:

{  
  "rewardSubscription": {
    "accountId": "XYZ",
    "startDate": "2015-12-29T19:00:00+05:30",
    "endDate": "2017-06-21T00:00:00+05:30",
    "isActive": true,
    "entityId": "ID123",
    "status": "ACTIVE"
  }
}
缩小范围--

现在,当我们编写针对此API调用的测试时。我们最终无法将响应映射到任何特定的POJO(java响应类)。测试代码-

问题--

是否有任何方法可以强制转换当前的API响应或以某种方式将其包装以映射到实际的POJO(
SomeResponseObject.class

提前谢谢。

问题 您收到一个带有
rewardSubscription
字段的对象,或者在您的情况下,收到一个带有
rewardSubscription
键的映射。无法将贴图直接转换为SomeResponseObject类型的对象

解决方案 选择1 手动将json转换为映射,并将其设置为SomeResponseObject实例:

JSONObject responseObject = new JSONObject(responseFromService.getResponseBody())
      .getJSONObject("RESPONSE");

ObjectMapper objectMapper = new ObjectMapper();
Map<String, SummaryObject> summaryMap = objectMapper.readValue(responseObject.toString(), new TypeReference<Map<String, SummaryObject>>() {});
SomeResponseObject response = new SomeResponseObject();
response.setSummaryMap(summaryMap);
然后在代码中你不在乎:

ObjectMapper objectMapper = new ObjectMapper();
SomeResponseObject response = objectMapper.readValue(json, SomeResponseObject.class);

据我所知,您的问题是将json数据解析为dto对象?如果您将json格式的客户机响应解析为pojo类,则有许多备选方案,其中一个是roo。。它创建和使用方面,并使用其api将其转换为:dto.toJson()//方面的内部代码:返回新的JSONSerializer().exclude(“*.class”).serialize(this);还有很多第三方库可用,比如:jackson是教程中的一员……我喜欢spring roo亲自为我的实体/pojo做一些事情,只需添加特定的注释“@rooson”@xyz——这不完全是我想要的。我们一直在使用映射器。问题是将修剪后的响应映射到定义的POJO,或者将响应包装以匹配POJO。
JSONObject responseObject = new JSONObject(responseFromService.getResponseBody())
      .getJSONObject("RESPONSE");

ObjectMapper objectMapper = new ObjectMapper();
Map<String, SummaryObject> summaryMap = objectMapper.readValue(responseObject.toString(), new TypeReference<Map<String, SummaryObject>>() {});
SomeResponseObject response = new SomeResponseObject();
response.setSummaryMap(summaryMap);
@Override
public SomeResponseObject deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode rootNode = jp.readValueAsTree();

    JsonNode sSummaryNode = rootNode.get("s_summary");
    if (sSummaryNode != null) {
        // Usual case.
        return objectMapper.treeToValue(sSummaryNode, SomeResponseObject.class);
    } else {
        // Special case - when received a map.
        Map<String, SummaryObject> summaryMap = objectMapper.readValue(rootNode.toString(), new TypeReference<Map<String, SummaryObject>>() {});
        SomeResponseObject response = new SomeResponseObject();
        response.setSummaryMap(summaryMap);
        return response;
    }
}
ObjectMapper objectMapper = new ObjectMapper();
SomeResponseObject response = objectMapper.readValue(json, SomeResponseObject.class);