Как разобрать JSON api с помощью JAVA?

#java

Вопрос:

Я новичок в JAVA, как разобрать название страны с помощью этого API: https://iplist.cc/api

Используйте JAVA для синтаксического анализа JSON: https://iplist.cc/api

Получите ТОЛЬКО значение «название страны».

Например,

Если название страны — «countryname»: «Германия»,

Результат должен быть только: Германия

Я попробовал это, но ничего не вышло: (

     public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {}

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line   "n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result "   e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data "   e.toString());
        }

        // return JSON String
        return jObj;

    }
}


// url to make request
private static String url = "https://iplist.cc/api";

// JSON Node names
private static final String COUNTRY_NAME = "countryname";

// contacts JSONArray
JSONArray contacts = null;



// Creating JSON Parser instance
JSONParser jParser = new JSONParser();

// getting JSON string from URL
JSONObject json = jParser.getJSONFromUrl(url);

    try {

    country = json.getString(COUNTRY_NAME);

    }
} catch (JSONException e) {
    e.printStackTrace();
}
 

Спасибо!

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

1. Пожалуйста, опубликуйте весь код целиком.

2. но не сработало , что не сработало? Вы получили какие-либо ошибки?

Ответ №1:

Для такой цели десериализации я бы рекомендовал вам использовать Gson (или что-то подобное).

 implementation 'com.google.code.gson:gson:2.8.6'
 

Подготовка IP-класса к десериализации:

 public class IP {
    public final String ip;
    public final String registry;
    public final String countrycode;
    public final String countryname;
    public final String detail;
    public final boolean spam;
    public final boolean tor;

    public IP(String ip, String registry,
              String countrycode, String countryname,
              String detail, boolean spam, boolean tor) {
        this.ip = ip;
        this.registry = registry;
        this.countrycode = countrycode;
        this.countryname = countryname;
        this.detail = detail;
        this.spam = spam;
        this.tor = tor;
    }
}
 

Десериализация из строки JSON с помощью Gson:

 IP ip = new Gson().fromJson(json, IP.class);
System.out.println(ip.countryname);
 

Ответ №2:

Сначала добавьте библиотеку org.json в свой проект. это для преобразования строки в JSONObject.

 public class HttpGet {

  public static String readGetRequestData(String urlToRead) throws IOException {
//    System.setProperty("https.proxyHost", "ip");
//    System.setProperty("https.proxyPort", "port"); if you got some proxy set it
    URL url = new URL(urlToRead);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("GET");
    return new String(connection.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
  }

  public static void main(String[] args) throws Exception {
    String data = readGetRequestData("https://iplist.cc/api");
    try {
      JSONObject jsonObject = new JSONObject(data);
      System.out.println(jsonObject.get("countryname"));
    } catch (JSONException err) {
      err.printStackTrace();
    }
  }
}
 

результат: Германия

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

1. Спасибо за это, но я использую Java 8. Это не работает: возвращает новую строку(connection.getInputStream().ReadAllBytes(), стандартные наборы символов. UTF_8);

2. @ejade вам просто нужно прочитать inputstream как строку, поэтому поищите в Google, в Java 8 есть разные способы чтения InputStream как String . Я не проверял ваш BufferedReader. если это сработает, вы можете изменить мой код на свой