Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring RestTemplate使用变量keyname解析JSON对象_Java_Json_Spring - Fatal编程技术网

Java Spring RestTemplate使用变量keyname解析JSON对象

Java Spring RestTemplate使用变量keyname解析JSON对象,java,json,spring,Java,Json,Spring,我有一个RESTAPI调用,它返回以下JSON对象。我需要用Spring的RestTemplate解析这个。问题在于,第一个键ISBN:0132856204是可变的(数字根据书本的不同而变化)。我该怎么做呢 { "ISBN:0132856204": { "publishers": [ { "name": "Pearson" } ], "pagination":

我有一个RESTAPI调用,它返回以下JSON对象。我需要用Spring的RestTemplate解析这个。问题在于,第一个键ISBN:0132856204是可变的(数字根据书本的不同而变化)。我该怎么做呢

{
    "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(…)