Нужна помощь в определении переменных из JSON отформатированного ответа API в Java - PullRequest
1 голос
/ 10 апреля 2020

Я работаю над программой, которая вызывает случайный API из PokeAPI и создает переменные из ответа для использования в качестве подсказок. У меня проблемы с созданием переменных из ответа http, особенно с помощью метода getJSONObject (), потому что я не знаю, что ставить в скобках. Если бы кто-нибудь мог показать мне, как определить переменные из этих данных, я был бы признателен. Благодарю вас. вот пример JSON данных

  "id": 12,
  "name": "butterfree",
  "base_experience": 178,
  "height": 11,
  "is_default": true,
  "order": 16,
  "weight": 320,
  "abilities": [
    {
      "is_hidden": true,
      "slot": 3,
      "ability": {
        "name": "tinted-lens",
        "url": "https://pokeapi.co/api/v2/ability/110/"
      }
    }

и вот моя попытка

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Random;


public class Main {
    public static void main(String[] args) throws JSONException, IOException {
        BufferedReader br;
        Gson gson = new Gson();
        Random random  = new Random();
        int randomPoke = random.nextInt(151)+1;
        String line;
        StringBuffer responseContent = new StringBuffer();
        String pokeURL = "https://pokeapi.co/api/v2/pokemon/" + randomPoke;
        URL url = new URL(pokeURL);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
        con.setReadTimeout(5000);
        con.setConnectTimeout(5000);
        int responseCode = con.getResponseCode();
        System.out.println(responseCode);
        if (responseCode > 299){
            br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
            while ((line = br.readLine()) != null){
                responseContent.append(line);
            }
            br.close();
        }else {
            br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            while ((line = br.readLine()) != null) {
                responseContent.append(line);
            }
            br.close();

        }

        String json = gson.toJson(responseContent);
        JSONObject jo = new JSONObject(json.trim().charAt(0));
        //JSONArray ja = new JSONArray();

        boolean isDefault = jo.getJSONObject(json).getBoolean("is_default");
        System.out.println(isDefault);
    } ```

1 Ответ

0 голосов
/ 10 апреля 2020

Есть много способов сделать это, у меня есть два предложения, и я использую только GSON lib

first

JsonElement element = JsonParser.parseString(json);

second

new Gson().fromJson(json, LinkedTreeMap.class);

Я написал тесты , может быть, это поможет вам больше

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.internal.LinkedTreeMap;
import org.junit.Test;

import static org.junit.Assert.assertTrue;

public class PokemonTest {
  @Test
  public void parserWithJsonParser() {
    //given
    String json = getJson();
    Boolean isDefault = null;
    //when
    JsonElement element = JsonParser.parseString(json);
    if (element.isJsonObject()) {
      JsonObject asJsonObject = element.getAsJsonObject(); // is your Object
      JsonElement element1 = asJsonObject.get("is_default");
      if (element1.isJsonPrimitive()) {
        isDefault = element1.getAsBoolean();
      }
    }
    //then
    assertTrue(isDefault);
  }

  @Test
  public void parserWithMapOfObject() {
    //given
    String json = getJson();
    //when
    LinkedTreeMap<String, Object> linkedTreeMap = new Gson().fromJson(json, LinkedTreeMap.class);
    Boolean isDefault = (Boolean) linkedTreeMap.get("is_default");
    //then
    assertTrue(isDefault);
  }


  public String getJson() {
    return "{\n" +
            "  " +
            "\"id\": 12,\n" +
            "  \"name\": \"butterfree\",\n" +
            "  \"base_experience\": 178,\n" +
            "  \"height\": 11,\n" +
            "  \"is_default\": true,\n" +
            "  \"order\": 16,\n" +
            "  \"weight\": 320,\n" +
            "  \"abilities\": [\n" +
            "    {\n" +
            "      \"is_hidden\": true,\n" +
            "      \"slot\": 3,\n" +
            "      \"ability\": {\n" +
            "        \"name\": \"tinted-lens\",\n" +
            "        \"url\": \"https://pokeapi.co/api/v2/ability/110/\"\n" +
            "      }\n" +
            "    }\n" +
            "  ]\n" +
            "}";
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...