Извлечение данных из RESTful API для анализа в формате json и извлечение данных оттуда JAVA

#java #json #rest #gson

#java #json #rest #gson

Вопрос:

Я имею дело с довольно старым API, предоставленным KhanAcademy.

Ссылка на git:https://github.com/Khan/khan-api/wiki/Khan-Academy-API

У меня нет никакого опыта использования сервисов REST или того, как анализировать Json из них. Я перепробовал все, что смог найти в Интернете, но большинство сообщений SO или других вещей в Интернете не требуют одновременной обработки как REST, так и json. Я попытался отобразить json на карту, но я не смог заставить это работать из-за того, что мои запросы Json не обрабатывались должным образом.

Вот несколько фрагментов кода, которые я пытался использовать:

 public static Object getConnection(String url){
    URL jsonUrl;
    String message;
    try{
        jsonUrl = new URL(url);
        System.out.println("This is the URL: "  jsonUrl);
    } catch (MalformedURLException ex) {
        message = "failed to open a new conenction. "  ex.getMessage();
        //logger.warn(message);
        throw new RuntimeException();
    }
    URLConnection connection;
    try{
        connection = jsonUrl.openConnection();
        connection.connect();
    }catch(IOException e){
        message = "Failed to open a new connection. "   e.getMessage();
        //logger.warn(message);
        throw new RuntimeException();
    }


    Object jsonContents;
    try{
        jsonContents = connection.getContent();


        System.out.println("This is the content: " jsonContents);
    }catch(IOException e){
        message = "failed to get contents.";
        //logger.warn(message);
        throw new RuntimeException(message);
    }
    return jsonContents;
    }

  

ниже используется JAX RS API

     Client client = ClientBuilder.newClient();
    WebTarget target = client.target("http://www.khanacademy.org/api/v1/topictree");
    JsonArray response = target.request(MediaType.APPLICATION_JSON).get(JsonArray.class);

}
  

Ниже приведен некоторый «код зомби», это компиляция того, что я пробовал, в основном, для проверки того, что я действительно потерялся и что я искал решение уже около 7 часов?

 
    JsonReader reader = new JsonReader(response);
    JsonParser parser = new JsonParser();

    JsonElement rootElement = parser.parse(reader);
    JsonElement rootElement = parser.parse(response.getAsString());
    JsonArray jsonArray = rootElement.getAsJsonArray();
    ArrayList results = new ArrayList();
    Gson myGson = new Gson();
    for(JsonElement resElement : jsonArray){
       //String mp4 = myGson.fromJson(resElement, );
   }
    JsonArray jarray =jsonObject.getAsJsonArray();

    jsonObject= jarray.get(0).getAsJsonObject();
    String result = jsonObject.get("title").getAsString();
    System.out.println(result);
    JsonObject resultObject = jsonObject.getAsJsonObject("url");
    String result = resultObject.getAsString();
    System.out.println(result);
    JsonObject jsonObject=response.get(0).getAsJsonObject();

    return new Gson().fromJson(url, mapType);
}
  

Приветствуется любая помощь.

Комментарии:

1. Что вы хотите извлечь из результата json после выполнения вызова API?

2. @Karan Привет, Каран, спасибо за ответ. Если я могу показать вам это: [ссылка] api-explorer.khanacademy.org/api/v1/topic [ссылка] . Я хотел бы получить все ссылки на YouTube / URL-адреса mp4 для темы, которую выбирает пользователь. Изначально я указал своему браузеру на [link] khanacademy.org/api/v1/topic [ссылка] /<название темы>. Проблема, вероятно, заключается в том, что я не знаю, что делать с проанализированным json. Я также обнаружил, что поиск по теме часто означал отсутствие результата, поэтому вместо этого я попытался указать на это: [ссылка] khanacademy.org/api/v1/topictree [ссылка]

Ответ №1:

Для этого вы можете использовать Feign.

Я рекомендую вам создать классы Java для представления структуры JSON, которая определена здесь

Вот базовая демонстрация:

 public class App {
    public static void main(String[] args) {
        KhanAcademyAPI khanAcademyAPI = Feign.builder()
                .decoder(new GsonDecoder())
                .logLevel(Logger.Level.HEADERS)
                .target(KhanAcademyAPI.class, "http://www.khanacademy.org");


        Topic root = khanAcademyAPI.tree();
        root.children.forEach(topic1 -> System.out.println(topic1.slug));

        Topic science = khanAcademyAPI.topic("science");
        science.children.forEach(topic1 -> System.out.println(topic1.description));

    }

    public static class Topic {
        String description;
        boolean hide;
        String slug;
        List<Topic> children;
    }

    interface KhanAcademyAPI {
        @RequestLine("GET /api/v1/topictree")
        Topic tree();

        @RequestLine("GET /api/v1/topic/{topic_slug}")
        Topic topic(@Param("topic_slug") String slug);
    }
}
  

Я использовал только следующие зависимости maven:

  • io.github.openfeign:feign-ядро: 10.2.0
  • io.github.openfeign:feign-gson: 10.2.0

Комментарии:

1. Вы — прекрасное создание. Большое вам спасибо. Я удивлен, что не вижу этого нигде в Интернете без специального поиска Feign. Вы не можете себе представить, какие проблемы у меня были при попытке работать с этим.