Это может быть глупый вопрос, но какой самый простой способ прочитать и разобрать JSON из URL в Java?
В Groovy это вопрос нескольких строк кода. Примеры Java, которые я нашел, смехотворно длинны (и имеют огромный блок обработки исключений).
Все, что я хочу сделать, это прочитать содержимое этой ссылки.
Используя артефакт 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"));
}
}
Здесь представлены пару версий альтернативы с Джексон (так как есть более чем один способ вы, возможно, захотите данных а):
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);
И конкретно обычной (ИМО) случай, когда вы хотите разобраться с Java-объектами, можно сделать один лайнер:
FacebookGraph graph = new ObjectMapper().readValue(url, FaceBookGraph.class);
Другие библиотеки, как Дсын также поддержка однострочных методов; поэтому многие примеры показывают гораздо больше разделов нечетное. И еще хуже то, что многие примеры использования устаревших орг.JSON-библиотекой; возможно, это была первая вещь, но есть еще полтора десятка лучшие альтернативы, так что есть очень мало причин, чтобы использовать его.
Самый простой способ: Использовать дсын, Google и#39;собственная библиотека Гото в формате JSON. https://code.google.com/p/google-gson/
Вот пример. Я'м собираюсь это бесплатный сайт геолокатор и парсинг JSON и отображать мой почтовый индекс. (просто положить эти вещи в метод main, чтобы проверить его)
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
Если вы Don'т ум через пару библиотек это может быть сделано в одной строке.
Включают Апач Викискладе IOUtils &ампер; json.org библиотеки.
JSONObject json = new JSONObject(IOUtils.toString(new URL("https://graph.facebook.com/me"), Charset.forName("UTF-8")));
Используйте HttpClient для получения содержимого URL. А затем используйте библиотеку из json.org для разбора JSON. Я использовал эти две библиотеки во многих проектах, и они были надежными и простыми в использовании.
Кроме того, вы можете попробовать использовать java-библиотеку Facebook API. У меня нет опыта в этой области, но на stack overflow есть вопрос, связанный с using a Facebook API in java. Вы можете рассмотреть RestFB как хороший выбор библиотеки для использования.
Я сделал парсер 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, вы просто называете этот класс и метод в вашем классе деятельности
мой код здесь
String url = "your url";
JSONParser jsonParser = new JSONParser();
JSONObject object = jsonParser.getJSONFromUrl(url);
String content=object.getString("json key");
вот в "в JSON ключ" это указывало на то, что ключ в JSON файл
это простой пример JSON-файла
{
"json":"hi"
}
Здесь "в JSON" это ключ и "Привет" это значение
Это будет получить значение JSON в строку Содержание.
Это's очень легко, используя Джерси клиента, просто включите этот зависимостей 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);
Я не уверен, что это эффективно, но это один из возможных способов:
Считать json из url с помощью url.openStream()
и считать содержимое в строку.
создать объект JSON с этой строкой (подробнее на json.org)
JSONObject(java.lang.String source)
Construct a JSONObject from a source JSON text string.