Java / Jackson注释:映射数组还是对象?

时间:2019-09-05 02:23:29

标签: java json serialization jackson

如果我可以获取以下JSON正文之一作为响应:

{
   "error" : "some error",
   "code": 123
}

[
 {
    "name" : "name",
    "value" : "value"
 },
 {
    "name" : "name",
    "value" : "value"
 }
]

是否有一种方法可以使用注释将这些响应中的任何一个映射到Java POJO以下?

public class Response {
    String error;
    int code;
    List<NameValuePair> nameValuePairs;
}

2 个答案:

答案 0 :(得分:0)

开箱即用,仅错误响应将反序列化。问题是它们本质上是不同的类型-对象与数组。

您可以使其与杰克逊的自定义模块一起使用,如here

所述

答案 1 :(得分:0)

一个可能的响应是JSON Object,另一个可能是JSON Array。在这种情况下,不可能创建一个POJO类来处理它。同样,这两个有效载荷对不同的含义:一个是SUCCESS,另一个是ERROR有效载荷。在那种情况下,我将使用Facade design pattern创建额外的层并将该复杂的逻辑隐藏在那里。可能如下所示:

class ResponseDeserialiserFacade {

    private final ObjectMapper mapper = new ObjectMapper();

    public List<NameValuePair> deserialisePairs(String json) {
        try {
            return mapper.readValue(json, new TypeReference<List<NameValuePair>>() {
            });
        } catch (IOException e) {
            try {
                Error error = mapper.readValue(json, Error.class);
                throw new RequestApiException(error, e);
            } catch (IOException e1) {
                throw new RequestApiException(Error.from("Can not parse: " + json), e1);
            }
        }
    }
}

您注意到我引入了新的异常:

class RequestApiException extends RuntimeException {
    private final Error error;

    RequestApiException(Error error, Exception base) {
        super(base);
        this.error = error;
    }

    public Error getError() {
        return error;
    }
}

具有Error类:

class Error {

    private String error;
    private String code;

    public static Error from(String message) {
        Error e = new Error();
        e.error = message;

        return e;
    }

    // getters, setters, toString
}

现在,我们可以对其进行SUCCESSERROR有效载荷的测试:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.util.List;

public class JsonApp {

    public static void main(String[] args) {
        String success = "[\n" +
                "  {\n" +
                "    \"name\" : \"name\",\n" +
                "    \"value\" : \"value\"\n" +
                "  },\n" +
                "  {\n" +
                "    \"name\" : \"name\",\n" +
                "    \"value\" : \"value\"\n" +
                "  }\n" +
                "]\n";

        tryToParse(success);

        String error = "{\n" +
                "   \"error\" : \"some error\",\n" +
                "   \"code\": 123\n" +
                "}";
        tryToParse(error);
    }

    private static void tryToParse(String json) {
        ResponseDeserialiserFacade deserialiser = new ResponseDeserialiserFacade();
        try {
            List<NameValuePair> pairs = deserialiser.deserialisePairs(json);
            System.out.println("SUCCESS: " + pairs);
        } catch (RequestApiException e) {
            System.out.println("ERROR: " + e.getError());
        }
    }
}

class NameValuePair {

    private String name;
    private String value;

    // getters, setters, toString
}

上面的代码显示:

SUCCESS: [NameValuePair{name='name', value='value'}, NameValuePair{name='name', value='value'}]
ERROR: Error{error='some error', code='123'}

如您所见,我们将错误消息视为异常。