Простейший способ прочитать 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, собственную библиотеку goo json google. https://code.google.com/p/google-gson/
Вот пример. Я перехожу на этот бесплатный сайт геолокатора и разбираю json и показываю свой почтовый индекс. (просто поместите этот материал в основной метод, чтобы проверить его)
String sURL = "http://freegeoip.net/json/"; //just a string
// Connect to the URL using java native library
URL url = new URL(sURL);
HttpURLConnection request = (HttpURLConnection) 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.
zipcode = rootobj.get("zip_code").getAsString(); //just grab the zipcode
Ответ 4
Если вы не возражаете использовать библиотеки паролей, это можно сделать в одной строке.
Включите библиотеки Apache Commons IOUtils и json.org.
JSONObject json = new JSONObject(IOUtils.toString(new URL("https://graph.facebook.com/me"), Charset.forName("UTF-8")));
Ответ 5
Используйте HttpClient, чтобы захватить содержимое URL-адреса. И затем используйте библиотеку из json.org для анализа JSON. Я использовал эти две библиотеки для многих проектов, и они были прочными и простыми в использовании.
Кроме того, вы можете попробовать использовать java-библиотеку Facebook API. У меня нет опыта в этой области, но есть вопрос о переполнении стека, связанный с с использованием API Facebook в java. Вы можете посмотреть RestFB как хороший выбор для использования библиотеки.
Ответ 6
Я сделал парсер json простейшим способом, вот он
package com.inzane.shoapp.activity;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
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");
System.out.println(line);
}
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());
System.out.println("error on parse data in jsonparser.java");
}
// return JSON String
return jObj;
}
}
этот класс возвращает объект json из URL
и если вы хотите, чтобы объект json вызывал этот класс и метод в классе Activity
мой код здесь
String url = "your url";
JSONParser jsonParser = new JSONParser();
JSONObject object = jsonParser.getJSONFromUrl(url);
String content=object.getString("json key");
здесь "json key" обозначается, что ключ в вашем json файле
это простой пример json файла
{
"json":"hi"
}
Здесь "json" является ключевым, а "hi" - значением
Это приведет к тому, что ваше значение json будет содержать строковое содержимое.
Ответ 7
Я не уверен, что это эффективно, но это один из возможных способов:
Прочтите json из url, используя url.openStream()
и прочитайте содержимое в строке.
постройте объект JSON с этой строкой (подробнее в json.org)
JSONObject(java.lang.String source)
Construct a JSONObject from a source JSON text string.
Ответ 8
Это очень просто, используя jersey-client, просто включите эту зависимость maven:
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.25.1</version>
</dependency>
Затем вызовите его, используя этот пример:
String json = ClientBuilder.newClient().target("http://api.coindesk.com/v1/bpi/currentprice.json").request().accept(MediaType.APPLICATION_JSON).get(String.class);
Затем используйте Google Gson для разбора JSON:
Gson gson = new Gson();
Type gm = new TypeToken<CoinDeskMessage>() {}.getType();
CoinDeskMessage cdm = gson.fromJson(json, gm);