Вопрос-ответ

Simplest way to read JSON from a URL in Java

Самый простой способ прочитать JSON из URL в Java

Это может показаться глупым вопросом, но какой самый простой способ прочитать и проанализировать JSON из URL в Java?

В Groovy это вопрос нескольких строк кода. Примеры Java, которые я нахожу, смехотворно длинные (и имеют огромный блок обработки исключений).

Все, что я хочу сделать, это прочитать содержимое этой ссылки.

Переведено автоматически
Ответ 1

Используя артефакт Maven org.json:json я получил следующий код, который, на мой взгляд, довольно короткий. Не настолько короткий, насколько это возможно, но все же пригодный для использования.

package so4308554;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.nio.charset.Charset;

import org.json.JSONException;
import org.json.JSONObject;

public class JsonReader {

private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}

public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
InputStream is = new URL(url).openStream();
try {
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
String jsonText = readAll(rd);
JSONObject json = new JSONObject(jsonText);
return json;
} finally {
is.close();
}
}

public static void main(String[] args) throws IOException, JSONException {
JSONObject json = readJsonFromUrl("https://graph.facebook.com/19292868552");
System.out.println(json.toString());
System.out.println(json.get("id"));
}
}
Ответ 2

Вот несколько альтернативных версий с Jackson (поскольку существует более одного способа, которым вам могут понадобиться данные в виде):

  ObjectMapper mapper = new ObjectMapper(); // just need one
// Got a Java class that data maps to nicely? If so:
FacebookGraph graph = mapper.readValue(url, FaceBookGraph.class);
// Or: if no class (and don't need one), just map to Map.class:
Map<String,Object> map = mapper.readValue(url, Map.class);

И, в частности, обычный случай (IMO), когда вы хотите иметь дело с объектами Java, может быть выполнен в виде одной строки:

FacebookGraph graph = new ObjectMapper().readValue(url, FaceBookGraph.class);

Другие библиотеки, такие как Gson, также поддерживают однострочные методы; странно, почему многие примеры показывают гораздо более длинные разделы. И что еще хуже, во многих примерах используется устаревшая библиотека org.json; возможно, это было первое, что появилось, но есть полдюжины лучших альтернатив, так что причин для ее использования очень мало.

Ответ 3

Самый простой способ: используйте gson, собственную библиотеку Google goto json. https://code.google.com/p/google-gson/

Вот пример. Я собираюсь зайти на этот бесплатный веб-сайт geolocator, проанализировать json и отобразить свой почтовый индекс. (просто поместите этот материал в основной метод, чтобы протестировать его)

    String sURL = "http://freegeoip.net/json/"; //just a string

// Connect to the URL using java's native library
URL url = new URL(sURL);
URLConnection request = url.openConnection();
request.connect();

// Convert to a JSON object to print data
JsonParser jp = new JsonParser(); //from gson
JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); //Convert the input stream to a json element
JsonObject rootobj = root.getAsJsonObject(); //May be an array, may be an object.
String zipcode = rootobj.get("zip_code").getAsString(); //just grab the zipcode
Ответ 4

Если вы не возражаете против использования пары библиотек, это можно сделать в одной строке.

Включите IOUtils Apache Commons & json.org библиотеки.

JSONObject json = new JSONObject(IOUtils.toString(new URL("https://graph.facebook.com/me"), Charset.forName("UTF-8")));

Зависимость Maven:

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.7</version>
</dependency>
java json