Простейший способ прочитать 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);