Самый простой способ прочитать JSON с URL в Java - PullRequest
230 голосов
/ 30 ноября 2010

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

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

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

Ответы [ 8 ]

183 голосов
/ 30 ноября 2010

Используя артефакт 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"));
  }
}
63 голосов
/ 30 ноября 2010

Вот несколько альтернативных версий с Джексоном (поскольку есть несколько способов, которыми вы можете получать данные как):

  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;это, возможно, было первым делом, но есть более полудюжины лучших альтернатив, так что причин для его использования очень мало.

54 голосов
/ 23 февраля 2014

Самый простой способ: Используйте gson, собственную библиотеку goto 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'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
37 голосов
/ 20 ноября 2014

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

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

JSONObject json = new JSONObject(IOUtils.toString(new URL("https://graph.facebook.com/me"), Charset.forName("UTF-8")));
6 голосов
/ 30 ноября 2010

Используйте HttpClient , чтобы получить содержимое URL. А затем используйте библиотеку json.org для анализа JSON. Я использовал эти две библиотеки во многих проектах, и они были надежными и простыми в использовании.

Кроме этого, вы можете попробовать использовать Java API библиотеки Facebook API. У меня нет никакого опыта в этой области, но есть вопрос о переполнении стека, связанного с использованием API Facebook в java . Возможно, вы захотите посмотреть на RestFB как на хороший выбор для библиотеки.

5 голосов
/ 08 июня 2013

Я выполнил анализатор 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" обозначается как ключ в вашем файле json

это простой пример файла json

{
    "json":"hi"
}

Здесь "json" - это ключ, а "hi" - это значение.

Это позволит получить значение json для строкового содержимого.

3 голосов
/ 12 марта 2017

С помощью 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);
2 голосов
/ 30 ноября 2010

Я не уверен, насколько это эффективно, но это один из возможных способов:

Для чтения json из URL используйте url.openStream() и считывайте содержимое в строку.

построить объект JSON с этой строкой (подробнее на json.org )

JSONObject(java.lang.String source)
      Construct a JSONObject from a source JSON text string.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...