Wouter C
Wouter C

Reputation: 543

Spring RestTemplate parse JSON object with variable keyname

I have a REST API call that returns the following JSON object. I need to parse this with Spring's RestTemplate. The problem is that the first key ISBN:0132856204 is variable (the numbers change depending on the book). How would I go about doing this?

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

Upvotes: 2

Views: 4026

Answers (3)

王聖閔
王聖閔

Reputation: 1

You can use JsonProperty to solve

@JsonProperty("ISBN:0132856204")

Upvotes: 0

Wouter C
Wouter C

Reputation: 543

This is the way I solved it, using JsonPath for getting the book out of the JSON object and Jackson for mapping it to a Book object:

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

Upvotes: 0

Tunceren
Tunceren

Reputation: 774

In here "ISBN:0132856204" is a value and also a key for your business. To get ISBN first, what about wrapping json content with 1 more closure?

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

First get the ISBN key as a value, then your ISBN value can be used as a key to get related content.

First goal will be extracting -String1,Object1- pair where String1 is "yourAwesomePlaceholderKey" and second goal will be again extracting -String2,Object2- from Object1 where String2 is your ISBN key.

Upvotes: 1

Related Questions