#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. если это сработает, вы можете изменить мой код на свой