java - 使用 Jackson 反序列化为 Map<String, String>

标签 java json jackson

我有以下 JSON:

{
  "parameters": [{
      "value": "somevalue",
      "key": "somekey"
    },
    {
      "value": "othervalue",
      "key": "otherkey"
    }
  ]
}

请注意,此响应的契约(Contract)保证 key 是唯一的。

我想将其反序列化为以下类:

public class Response {

  public Map<String, String> parameters;

}

我如何使用 Jackson 库执行此操作?

最佳答案

你需要注册一个解串器:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Response.class, new ResponseDeserializer());
mapper.registerModule(module);

Response resp = mapper.readValue(myjson, Response.class);

这是一个例子:

public class ResponseDeserializer extends StdDeserializer<Response> {
    public ResponseDeserializer() { 
        this(null); 
    } 

    public ResponseDeserializer(Class<?> vc) { 
        super(vc); 
    }

    @Override
    public Response deserialize(JsonParser jp, DeserializationContext dc)
            throws IOException, JsonProcessingException {
        Response resp = new Response();
        resp.parameters = new HashMap<>();
        JsonNode node = jp.getCodec().readTree(jp);
        ArrayNode parms = (ArrayNode)node.get("parameters");
        for (JsonNode parm: parms) {
            String key = parm.get("key").asText();
            String value = parm.get("value").asText();
            resp.parameters.put(key, value);
        }
        return resp;
    }   
}

关于java - 使用 Jackson 反序列化为 Map<String, String>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48060487/

相关文章:

java - OpenJPA、 Jersey 、JUnit : Using a different persistence unit for my unit tests?

java - 为什么 JPA 规范(包括 2.0)或 Hibernate 扩展不允许您指定生成器,例如@Version 注释的 Oracle 序列

json - AngularJS:如何获取 JSON 对象的键

java - 如何在 tomcat 上使用 LDAP 设置 CAS .. 没有错误

java - 基于另一个数组递增数组中的值

python - Pandas 行到 json

json - 如何调用循环返回 JSON 的 URL

java - 与 jackson 在中间表上的无限递归

java - 如何使用 Jackson 来验证重复的属性?

java - jackson :如果属性(property)丢失怎么办?