Ошибка при десериализации JSON с помощью Jersey

158
30 апреля 2019, 14:30

Пока разбираюсь именно с Jersey, поэтому не предлагайте другие библиотеки.

Итак, хочу получать с сайта курсы валют (НБУ) и превращать их в объекты.

Сразу оговорюсь, что в формате XML все работает. Не работает именно JSON. Образец взял отсюда.

package misc.jersey;
import javax.ws.rs.core.MediaType;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.GenericType;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.WebResource.Builder;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import java.util.List;
public class CurrenciesJSON {
    public static void main(String[] args) {
        ClientConfig clientConfig = new DefaultClientConfig();
        // Create Client based on Config
        Client client = Client.create(clientConfig);
        WebResource webResource = client.resource("https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?json");
        Builder builder = webResource.accept(MediaType.APPLICATION_JSON) //
                .header("content-type", MediaType.APPLICATION_JSON);
        ClientResponse response = builder.get(ClientResponse.class);
        // Status 200 is successful.
        if (response.getStatus() != 200) {
            System.out.println("Failed with HTTP Error code: " + response.getStatus());
            String error = response.getEntity(String.class);
            System.out.println("Error: " + error);
            return;
        }
        GenericType<List<Currency>> generic = new GenericType<List<Currency>>() {
            // No thing
        };
        List<Currency> list = response.getEntity(generic);
        System.out.println("Output from Server .... \n");
        for (Currency currency : list) {
            System.out.println("-------------------------------------");
            System.out.println(currency);
        }
    }
}

Entity

package misc.jersey;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement()
@XmlAccessorType(XmlAccessType.FIELD)
public class Currency {
    private int r030;
    private String txt;
    private double rate;
    private String cc;
    private String exchangedate;
    public Currency() {
    }
    @Override
    public String toString() {
        return "Currency{" +
                "r030=" + r030 +
                ", txt='" + txt + '\'' +
                ", rate=" + rate +
                ", cc='" + cc + '\'' +
                ", exchangedate=" + exchangedate +
                '}';
    }
}

Exception: Exception in thread "main" javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException - with linked exception: [com.sun.istack.internal.SAXParseException2; lineNumber: 3; columnNumber: 10; unexpected element (uri:"", local:"r030"). Expected elements are <{}currency>] at com.sun.jersey.core.provider.jaxb.AbstractListElementProvider.readFrom(AbstractListElementProvider.java:355) etc...

Если поменять адрес запроса на https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?xml и в заголовке на MediaType.APPLICATION_XML, то работает!

В чем проблема? Что за unexpected element (uri:"", local:"r030")?

READ ALSO
Запуск java файла после компиляции

Запуск java файла после компиляции

Почему после в консоли после компиляции java файла1)Командой javac Helloworld

178
Чем отличается newFixedThreadPool от newSingleThreadExecutor

Чем отличается newFixedThreadPool от newSingleThreadExecutor

Разбираю конкурентность и заметил такие вариации Executor-а Для однопоточности

173
Как сравнить два аудио файла

Как сравнить два аудио файла

Я много искал как сравнить два аудио файла, но нигде не нашел пример такой задачи

173
Как остановить горизонтальный скрол?

Как остановить горизонтальный скрол?

Как остановить горизонтальный скролл, а затем скролить по горизонтали в обратном направлении

157