2017-10-20 183 views
1

因此,通过对Stackoverflow的研究,especially this topic,我确定我有一个嵌入在其他工作的getter/setter设置中的JSON对象字典。当我打电话给API时,这些属性的传统getter/setter工作正常,但那是因为我知道属性的名称是什么。我怎样才能得到这个工作对象的名字为errors的未知属性,以及该对象在(Map<String,List>)中的格式是什么?解析和映射具有动态属性的JSON对象

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); 
+0

是“一些错误消息”的JSON数组或JSON对象? –

+0

它看起来像一个字符串数组(但只有一个字符串),这个例子就是它返回的确切格式。 –

回答

0

我的解决方案是分层的。

首先,the discovery that Moxy只是不做地图是可怕的,但宁愿一旦我发现问题是reliving。所以我不得不将我的默认串行器从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。