Пока разбираюсь именно с 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")
?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Почему после в консоли после компиляции java файла1)Командой javac Helloworld
Разбираю конкурентность и заметил такие вариации Executor-а Для однопоточности
Я много искал как сравнить два аудио файла, но нигде не нашел пример такой задачи
Как остановить горизонтальный скролл, а затем скролить по горизонтали в обратном направлении