【问题标题】:Parsing and Mapping a JSON Object with Dynamic Properties使用动态属性解析和映射 JSON 对象
【发布时间】:2025-11-24 01:20:10
【问题描述】:

因此,通过对 * 的研究,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&lt;String,List&gt;)以便我可以开始接收这个动态的 errors 对象?

我正在使用Invocation.Builder 将 API 响应解析为一个对象。

Response response= invocationBuilder.post(Entity.entity(APIRequest, MediaType.APPLICATION_JSON));
APIResponse formattedResponse = response.readEntity(APIResponse.class);

【问题讨论】:

  • “一些错误信息”是json数组还是json对象?
  • 它看起来像一个字符串数组(但只有一个字符串),示例是它返回的确切格式。

标签: java jackson


【解决方案1】:

我的解决方案是分层的。

首先,the discovery that Moxy 只是不做地图是可怕的,而是在我发现问题所在时重温。所以我不得不将我的默认序列化程序从 Moxy 更改为 Jackson。这很容易通过更改pom.xml

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey.version}</version>
</dependency>

其次,我的尝试有点错误,而不是:

private Map&lt;String, List&gt; errors = new HashMap&lt;&gt;();

我真的需要:

private HashMap&lt;String, ArrayList&lt;String&gt;&gt;;

将构造函数与它保持一致总是会清除数据。相反,我只是初始化地图,然后在 POJO 上创建普通的 getter/setter。

【讨论】: