2017-05-12 20 views
2

次のJSONオブジェクトを返すREST API呼び出しがあります。私はこれをSpringのRestTemplateと解析する必要があります。問題は、最初のキーISBN:0132856204が可変であることです(数字は本に応じて変わります)。これをどうやってやりますか?Spring RestTemplateは変数keynameを持つJSONオブジェクトを解析します

{ 
    "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" 
    } 
} 
+0

あなたは0132856204で、キーISBNの平均値右? – pvpkiran

+0

[JsonPath](https://github.com/json-path/JsonPath)をご覧ください。 '' $ .. * ''演算子は' ISBN:0132856204'のような動的ルートキーを指定せずに必要な詳細を与えると思います。 –

+0

私はISBNをパラメータとして、このURIにGETを行います: 'https://openlibrary.org/api/books?bibkeys=ISBN:{isbn}&format = json&jscmd = data'です。私はこれをRestTemplateとJackson(それは学校の課題です)で解決したいと思いますが、JsonPathはそれを調べる価値があるように見えます。 –

答えて

0

これは私がブックオブジェクトにマッピングするためのJSONオブジェクトとジャクソンの外に本を取得するためJsonPathを使用して、それを解決する方法です:

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); 
+0

なぜ 'Configuration.setDefaults(...)'を呼びますか? –

0

ここで、「ISBN:0132856204」はビジネスの価値とキーです。 ISBNを最初に取得するには、jsonコンテンツを1つ以上閉じてラップする方法はありますか?

{ 
    "yourAwesomePlaceHolderKey" : 
    { 
     "ISBN:0132856204": { 
     ...... 
     } 
    } 
} 

最初にISBNキーを値として取得すると、ISBN値を関連するコンテンツを取得するためのキーとして使用できます。

最初の目標は、String1が "yourAwesomePlaceholderKey"で、2番目の目標はObject2からObject1を抽出します。ここで、String2はISBNキーです。

関連する問題