これは愚かな質問かもしれませんが、JSONfromURLを読み、解析する最も簡単な方法は何でしょうか。/inJava?
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"));
}
}
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);
具体的には、Javaオブジェクトを扱いたいという通常の(IMO)のケースは、1つの裏書きにすることができます。
FacebookGraph graph = new ObjectMapper().readValue(url, FaceBookGraph.class);
Gsonのような他のライブラリも一行メソッドをサポートします。多くの例ではるかに長いセクションが表示されるのはなぜか奇妙です。さらに悪いことに、多くの例が時代遅れのorg.jsonライブラリを使っているということです。それが最初のことかもしれませんが、それを使用する理由はほとんどないので、半ダースより良い選択肢があります。
最も簡単な方法:Googleのgoto jsonライブラリgsonを使用してください。 https://code.google.com/p/google-gson/
これがサンプルです。私はこの無料の地理位置情報Webサイトに行き、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
いくつかのライブラリを使用しても構わない場合は、1行で実行できます。
Apache Commons IOUtils & json.org ライブラリを含みます。
JSONObject json = new JSONObject(IOUtils.toString(new URL("https://graph.facebook.com/me"), Charset.forName("UTF-8")));
URLの内容を取得するには、 HttpClient を使用します。そして、JSONを解析するために json.org のライブラリを使用します。私はこれら2つのライブラリを多くのプロジェクトで使ってきましたが、それらは堅牢で使いやすいものでした。
それ以外に、あなたはFacebook API Javaライブラリを使ってみることができます。私はこの分野での経験はありませんが、JavaでFacebook APIを使用することに関連したスタックオーバーフロー に関する質問があります 。ライブラリを使うには、 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;
}
}
このクラスはURLからJSONオブジェクトを返します。
そして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の値が文字列コンテンツになります。
それは非常に簡単です、ジャージクライアントを使用して、ちょうどこの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);
これが効率的かどうかはわかりませんが、これが可能な方法の1つです。
Urlからjsonを読み、url.openStream()
を使って内容を文字列に読み込みます。
この文字列を使ってJSONオブジェクトを構築します(もっと json.org )
JSONObject(Java.lang.String source)
Construct a JSONObject from a source JSON text string.