因此,通过 Stackoverflow 上的研究,especially this topic ,我确定我有一个 JSON 对象字典嵌入在其他有效的 getter/setter 设置中。当我调用 API 时,属性的传统 getter/setter 运行良好,但这是因为我知道属性的名称是什么。我怎样才能让它适用于名为 errors
的对象的未知属性,该对象的格式是什么( Map<String,List>
)?
API 响应:
{
"success":false,
"response_code":1,
"status_message":"One or more errors has occurred.",
"errors":{
"171":["Some error message."],
"555":["Some other error message."]
}
}
我的POJO:
public class APIResponse {
private boolean success;
private int response_code;
private String status_message;
private Map<String, List> errors = new HashMap<>();
...
}
如何设置 getter/setter 和正确的字典格式(看起来可能是 Map<String,List>
),以便我可以开始接收这个动态 errors
对象?
我正在使用Invocation.Builder
将 API 响应解析为对象。
Response response= invocationBuilder.post(Entity.entity(APIRequest, MediaType.APPLICATION_JSON));
APIResponse formattedResponse = response.readEntity(APIResponse.class);
最佳答案
我的解决方案是分层解决方案。
首先,the discovery that Moxy只是不做 map 是可怕的,而是一旦我发现这是问题所在,就会重新经历。所以我不得不将我的默认序列化器从 Moxy 更改为 Jackson。通过更改 pom.xml
可以轻松完成此操作。 :
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey.version}</version>
</dependency>
其次,我的尝试有点错误,而不是:
private Map<String, List> errors = new HashMap<>();
我真的需要:
private HashMap<String, ArrayList<String>>;
将构造函数与它对齐总是会删除数据。相反,我只是初始化映射,然后在 POJO 上创建普通的 getter/setter。
关于java - 解析和映射具有动态属性的 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46850426/