Java Spring RestTemplate使用变量keyname解析JSON对象
我有一个RESTAPI调用,它返回以下JSON对象。我需要用Spring的RestTemplate解析这个。问题在于,第一个键ISBN:0132856204是可变的(数字根据书本的不同而变化)。我该怎么做呢Java Spring RestTemplate使用变量keyname解析JSON对象,java,json,spring,Java,Json,Spring,我有一个RESTAPI调用,它返回以下JSON对象。我需要用Spring的RestTemplate解析这个。问题在于,第一个键ISBN:0132856204是可变的(数字根据书本的不同而变化)。我该怎么做呢 { "ISBN:0132856204": { "publishers": [ { "name": "Pearson" } ], "pagination":
{
"ISBN:0132856204": {
"publishers": [
{
"name": "Pearson"
}
],
"pagination": "xxiv, 862p",
"identifiers": {
"isbn_13": [
"978-0-13-285620-1"
],
"openlibrary": [
"OL25617855M"
]
},
"weight": "1340 grams",
"title": "Computer networking",
"url": "https://openlibrary.org/books/OL25617855M/Computer_networking",
"number_of_pages": 862,
"cover": {
"small": "https://covers.openlibrary.org/b/id/7290810-S.jpg",
"large": "https://covers.openlibrary.org/b/id/7290810-L.jpg",
"medium": "https://covers.openlibrary.org/b/id/7290810-M.jpg"
},
"publish_date": "2013",
"key": "/books/OL25617855M",
"authors": [
{
"url": "https://openlibrary.org/authors/OL31244A/James_F._Kurose",
"name": "James F. Kurose"
},
{
"url": "https://openlibrary.org/authors/OL658909A/Keith_W._Ross",
"name": "Keith W. Ross"
}
],
"subtitle": "A Top-Down Approach"
}
}
在这里,“ISBN:0132856204”是一个价值,也是您业务的关键。
为了首先获得ISBN,如何用一个以上的闭包包装json内容
{
"yourAwesomePlaceHolderKey" :
{
"ISBN:0132856204": {
......
}
}
}
首先获取ISBN密钥作为值,然后您的ISBN值可以用作获取相关内容的密钥
第一个目标是提取-String1,Object1-对,其中String1是“yourAwesomePlaceholderKey”,第二个目标是再次从Object1中提取-String2,Object2-其中String2是您的ISBN密钥 这就是我解决问题的方法,使用JsonPath从JSON对象中获取图书,Jackson将图书映射到图书对象:
RestTemplate restTemplate = new RestTemplate();
String isbn = "0132856204";
String endpoint = "https://openlibrary.org/api/books?jscmd=data&format=json&bibkeys=ISBN:{isbn}";
//Get JSON as String
String jsonString = restTemplate.getForObject(endpoint, String.class, isbn);
//Configure JsonPath to use Jackson for mapping
Configuration.setDefaults(new Configuration.Defaults() {
private final JsonProvider jsonProvider = new JacksonJsonProvider();
private final MappingProvider mappingProvider = new JacksonMappingProvider();
@Override
public JsonProvider jsonProvider() {
return jsonProvider;
}
@Override
public MappingProvider mappingProvider() {
return mappingProvider;
}
@Override
public Set<Option> options() {
return EnumSet.noneOf(Option.class);
}
});
//Parse the JSON as a book
Book book = JsonPath.parse(jsonString).read("$.ISBN:" + isbn, Book.class);
RestTemplate RestTemplate=new RestTemplate();
字符串isbn=“0132856204”;
字符串端点=”https://openlibrary.org/api/books?jscmd=data&format=json&bibkeys=ISBN:{isbn}”;
//获取JSON作为字符串
String jsonString=restemplate.getForObject(端点,String.class,isbn);
//配置JsonPath以使用Jackson进行映射
setDefaults(新的Configuration.Defaults(){
私有最终JsonProvider JsonProvider=新JacksonJsonProvider();
private final MappingProvider MappingProvider=新JacksonMappingProvider();
@凌驾
公共JsonProvider JsonProvider(){
返回jsonProvider;
}
@凌驾
公共映射提供程序映射提供程序(){
返回mappingProvider;
}
@凌驾
公共集选项(){
返回EnumSet.noneOf(Option.class);
}
});
//将JSON解析为一本书
Book Book=JsonPath.parse(jsonString.read)(“$.ISBN:”+ISBN,Book.class);
您可以使用JsonProperty来解决
@JsonProperty(“ISBN:0132856204”)您是指密钥ISBN的值,即0132856204,对吗?请查看。我认为
“$..*”
操作符将为您提供所需的详细信息,而无需指定动态根键,如ISBN:0132856204
。我使用ISBN作为参数获取此URI:https://openlibrary.org/api/books?bibkeys=ISBN:{isbn}&format=json&jscmd=data
。我更愿意用RestTemplate和Jackson解决这个问题(这是一个学校作业),但JsonPath看起来确实值得研究。为什么要调用Configuration.setDefaults(…)
?