我使用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的任何想法?
答案 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");
尝试嵌套值时,这种方法会变得更加棘手。