【问题标题】:Java/Jackson Annotations: Mapping either an array or object?Java/Jackson 注释:映射数组或对象?
【发布时间】:2019-09-05 02:23:29
【问题描述】:

如果我可以得到以下 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;
}

【问题讨论】:

  • 为此,您需要拥有带有键 nameValuePairs 的成功响应数组 - 这样{"nameValuePairs" : [{"name" : "name", "value" : "value" }, ...]}
  • @ShreyGarg 是的,这就是问题所在......外部系统只是返回一个数组......
  • 收到响应后,是不是以字符串的形式获取?

标签: java json serialization jackson


【解决方案1】:

开箱即用,只有错误响应会反序列化。问题是它们是根本不同的类型——对象与数组。

您可以使其与 jackson 的自定义模块一起使用,如 here 所述

【讨论】:

    【解决方案2】:

    一个可能的响应是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'}
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 2016-02-14
      • 1970-01-01
      • 2015-10-25
      相关资源
      最近更新 更多