为不同结构中的每个JSON响应创建POJO?

时间:2015-10-25 16:21:39

标签: java json

我使用RestTemplate来调用一些第三方API,而RestTemplate会自动将收到的JSON转换为java POJO:

Result result = restTemplate.getForObject(url, Result.class);

但有时JSON结构非常简单,例如两个例子:

{"access_token":"abcdefg","expires_in":7200}  //only need access_token

{"status":0,"result":{"x":25,"y":46}}  //only need "x" and "y"

我应该为不同结构中的每个JSON响应创建POJO吗?

例如,第一个JSON结构的POJO:

public class TokenResult {
    private String access_token;
    private String expires_in;

    /* Getters and Setters */
    ......
}

对于第二个JSON结构:

public class CoordResult {
    private String status;   
    private Coordinate result;

    /* Getters and Setters */
    ......
}

public class Coordinate {
    private String x;
    private String y;

    /* Getters and Setters */
    ......
}

我不认为这样做很优雅,因为有些JSON结构非常简单,有些只使用一次,例如" access_token"响应。

关于如何避免过多简单POJO的任何想法?

2 个答案:

答案 0 :(得分:1)

你在那里的例子非常好。即使你觉得你有太多POJO与不使用的财产成员这IMO是最好和未来证明的方法。想象一下,在不久的将来,您需要实现需要访问TokenResult.getExpiresIn()的功能,这意味着您仍然会最终重构基础POJO并添加该方法和类成员。

CoordResult的类似示例中,我看到status是一个非常重要的属性,一旦收到响应就需要检查,因此将其映射到POJO中的类成员是个好主意。

这将使您的代码更具弹性,并且可以通过定义良好的结构进行预测,并封装响应中的所有可用数据。

虽然如果你在上下文和结构方面有类似的反应,你总是可以扩展一个基础POJO并将相关的类成员添加到子类。

另一个好处是,这一切都使得客户端代码易于阅读,因为我们可以告诉我们对响应对象的期望,并且可以在不同的实现中使用,其中许多可能现在不适用和可见。

如果您决定不需要JSON响应的所有属性,您仍然可以在类上使用@JsonIgnoreProperties注释,并且它将从JSON映射中排除任何未知元素。

EX:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class TokenResult {
    private String access_token;

    // you don't need this
    // private String expires_in;
}

答案 1 :(得分:-1)

如果您只是从响应中查找某些值,则可以尝试使用org.json包(http://www.json.org/javadoc/)。它具有访问JSON响应中的值的方法。

String jsonStr = "{\"access_token\":\"abcdefg\",\"expires_in\":7200}";
String accessToken = new JSONObject(jsonStr).getString("access_token");

尝试嵌套值时,这种方法会变得更加棘手。