【问题标题】:Define POJO for changing JSON responses定义 POJO 以更改 JSON 响应
【发布时间】:2018-07-24 05:50:46
【问题描述】:

我正在使用 Java 8/Spring 5 调用第三方 API。我正在使用运行良好的 HttpClient,并且我有一个 99% 的时间都可以运行的 POJO。

当我调用这项服务时,JSON 看起来像:

{"field1":"a",
 "field2":"b",
 "field3:"c"}

根据不同的参数,它可以返回为:

{"field1":"a",
 "field2":{
    "subfield1:"x",
    "subfield2:"y",
    "subfield3":"z"},
 "field3:"c"}

我正在使用最新的 FastJacksonMapper 将 JSON 字符串转换为 Java POJO,它在第一个实例中有效,但在第二个实例中无效。

我知道 JSON 根据请求进行更改可能很常见,但我希望 JSON 更加一致。

关于如何调整我的 POJO 有什么想法吗?我可以使用任何 JSON 注释来解决这个问题吗?或者,也许创建一个单独的 POJO,以便在一个失败的情况下,另一个接手?

谢谢!

【问题讨论】:

  • 您希望原始值还是对象作为 field2 的一部分?如果您期望两者(基于参数),那么对于您的 API 和使用它的客户端来说,这是一个糟糕的设计。这将造成很多麻烦(现在和将来)。后果自负。
  • 这不是我的 API ...我绝对不会那样做。这是来自第三方的 API,完全是另一家公司。我同意,这个设计是个问题。最棒的是,这家公司就在我们隔壁,我会走过去和 CEO 交谈。 :-D 他们真的是一群好人!
  • 我明白了......问题:它是否始终如一地返回具有给定参数集的值和具有不同参数集的对象? - 如果收到的响应与提交的参数一致,那么您至少可以有两种单独的方法(使用不同的映射器)并根据您发送的参数使用一种或另一种。换句话说,既然您知道自己要问的是哪种类型的问题,那么您就可以根据它来调整答案的处理方式

标签: java json spring jackson2


【解决方案1】:

那么对于相同的 URL 和 http 方法,您可以获得不同的有效载荷吗?相同的键“field2”可能在选项 A 中有一个字符串值,而在选项 B 中有一个不同的对象?恕我直言,这是糟糕的 API 设计。

那个第三方 API 有任何像 swagger 这样的描述吗?这样的描述将帮助您生成带有正确注释的正确 POJO。

如果没有此类文档,请尝试使用生成器,例如:http://www.jsonschema2pojo.org/

【讨论】:

    【解决方案2】:
    private static Either<Type1Obj, Type2Obj> getPojoFromJson(String json) {
            try {
                // Type1Obj from json
                return Either.left(obj1);
            } catch (IOException e) {
                try {
                    //Type2Obj from json
                    return Either.right(obj2);
                } catch (IOException e1) {
                    //fallback
                }
                e.printStackTrace();
            }
    
            return null;
    }
    

    【讨论】:

    • 添加一些关于你试图用给定代码做什么的评论有很长的路要走。一堆没有解释的代码无济于事。
    • 这里我尝试将 json 数据转换为 Type1 pojo,如果出现异常,然后我尝试将其转换为 typ2 pojo 并根据成功转换将返回类型设置为 Either。
    猜你喜欢
    • 2017-04-19
    • 2019-08-01
    • 2019-10-19
    • 2020-02-07
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    相关资源
    最近更新 更多