Gson не парсит обьект, в чем проблема?

Рейтинг: 0Ответов: 1Опубликовано: 26.05.2023

Я решил сделать программу для обработки списка топ артистов с lastFM, где получаю ответ с сервера lastFM в виде JSON:

{
  "artists": {
    "artist": [
      {
        "name": "The Weeknd",
        "playcount": "469394384",
        "listeners": "3276211"
// ...
      },
      {
        "name": "Taylor Swift",
        "playcount": "1350758832",
        "listeners": "3966437"
// ...
      },
      {
        "name": "Tyler, the Creator",
        "playcount": "380608357",
        "listeners": "2319508"
// ...
      }
    ],
    "@attr": {
      "page": "1",
      "perPage": "50",
      "totalPages": "94756",
      "total": "4737792"
    }
  }
}

JSON валиден, с ним все в порядке, но когда дело доходит до парсинга Gson'ом, он выдает мне целый обьект вместо массива. Почему так?

мой код:

package ru.kurkin.springpetproject.controller;

import com.google.gson.Gson;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class MainController {
    @RequestMapping("/top")
    public Object requestTopArtists(RestTemplate restTemplate) {
        String url = "Здесь мой ключ к api lastFM";
        String response = restTemplate.getForObject(url, String.class);
        Gson gson=new Gson();
        Object object = gson.fromJson(response,Object.class);
        return object;
    }
}

Я пробовал сделать массив типа такого:

Artist[] artists=gson.fromJson(response,Artist[].class);

Но он выдает ошибку:

Expected BEGIN_ARRAY but was BEGIN_OBJECT

Модель данных:

package ru.kurkin.springpetproject.model;

public class Artists {
    Artist[] artists;

    public Artist[] getArtist() {
        return artists;
    }

    public void setArtist(Artist[] artist) {
        this.artists = artist;
    }
}

Ответы

▲ 1Принят

У вас получается какая-то структура вроде такой:

  • Внешний класс-контейнер
@Data
public class MyResponse {
    private Artists artists;
}
  • Класс-контейнер требуемого массива
@Data
public class Artists {
    public Artist[] artist;
}

Тогда парсинг может выглядеть как-то так:

public static Artist[] artists(String json) {
    Gson gson = new Gson();
    MyResponse response = gson.fromJson(json, MyResponse.class);
    return response.getArtists().getArtist();
}