タイプString
のJSONからデータを解析したいです。私は Google Gson を使っています。
私は持っています:
jsonLine = "
{
"data": {
"translations": [
{
"translatedText": "Hello world"
}
]
}
}
";
そして私のクラスは:
public class JsonParsing{
public void parse(String jsonLine) {
// there I would like to get String "Hello world"
}
}
これはそれをするための簡単なコードです、私はすべてのチェックを避けました、しかしこれは主な考えです。
public String parse(String jsonLine) {
JsonElement jelement = new JsonParser().parse(jsonLine);
JsonObject jobject = jelement.getAsJsonObject();
jobject = jobject.getAsJsonObject("data");
JsonArray jarray = jobject.getAsJsonArray("translations");
jobject = jarray.get(0).getAsJsonObject();
String result = jobject.get("translatedText").getAsString();
return result;
}
より一般的に使用するには、 Gsonのjavadocs が非常に明確で役立つことがわかります。
私の最初のgsonアプリケーションでは、主に設定の問題でjsonを使用しているため、値を受け取るために追加のクラスを使用することを避けました
情報がないにもかかわらず(gsonページでさえ)、それが私が見つけて使ったものです:
から始まる
Map jsonJavaRootObject = new Gson().fromJson("{/*whatever your mega complex object*/}", Map.class)
Gsonは{}を見るたびにMap(実際にはgson StringMap)を作成します。
Gsonは ''を見るたびにStringを作成します
Gsonは数字を見るたびにDoubleを作成します
Gsonは[]を見るたびにArrayListを作成します。
あなたはこの事実を(組み合わせて)あなたの有利に使うことができます
最後にこれは物事を作るコードです
Map<String, Object> javaRootMapObject = new Gson().fromJson(jsonLine, Map.class);
System.out.println(
(
(Map)
(
(List)
(
(Map)
(
javaRootMapObject.get("data")
)
).get("translations")
).get(0)
).get("translatedText")
);
最も簡単なことは、通常、次のように、一致するオブジェクト階層を作成することです。
public class Wrapper {
public Data data;
}
static class Data {
public Translation[] translations;
}
static class Translation {
public String translatedText;
}
そしてGSONを使用してバインドし、フィールドを介してオブジェクト階層を走査します。ゲッターとセッターを追加しても、基本的なデータコンテナには意味がありません。
だから、のようなもの:
Wrapper value = GSON.fromJSON(jsonString, Wrapper.class);
String text = value.data.translations[0].translatedText;
Jsonオブジェクトに対応するJavaクラスを作成できます。整数の文字列値はそのままマッピングできます。 Jsonはこのように解析することができます -
Gson gson = new GsonBuilder().create();
Response r = gson.fromJson(jsonString, Response.class);
これが例です--- http://rowsandcolumns.blogspot.com/2013/02/url-encode-http-get-solr-request-and.html
JSONオブジェクトを表すために別のクラスを使用し、@SerializedName
アノテーションを使用して各データメンバーに対して取得するフィールド名を指定することができます。
public class Response {
@SerializedName("data")
private Data data;
private static class Data {
@SerializedName("translations")
public Translation[] translations;
}
private static class Translation {
@SerializedName("translatedText")
public String translatedText;
}
public String getTranslatedText() {
return data.translations[0].translatedText;
}
}
それからGson
オブジェクトを使ってparse()メソッドの中で構文解析を行うことができます。
Gson gson = new Gson();
Response response = gson.fromJson(jsonLine, Response.class);
System.out.println("Translated text: " + response.getTranslatedText());
このアプローチでは、Response
クラスを再利用して、JSONから抽出したい他のデータメンバーをピックアップするための他のフィールドを追加することができます。または、検出されたソース言語の追加文字列を取得します。
Gsonを使って解く
json文字列内の個々のパラメータに対してクラスを作成します。あるいは、 "Data"というメインクラスを1つ作成してから、同様に内部クラスを作成することもできます。わかりやすくするために、別々のクラスを作成しました。
クラスは以下の通りです。
JsonParsingクラスのメソッド "parse"では、Reflectionを使ってJavaオブジェクトのStringを変換するgson.fromJson(jsonLine, Data.class)
を呼び出します。
"Data"オブジェクトにアクセスしたら、各パラメータに個別にアクセスできます。
私は自分の開発マシンから離れているので、このコードをテストする機会がありませんでした。しかし、これは助けになるはずです。
いくつかの良い例と記事
http://albertattard.blogspot.com/2009/06/practical-example-of-gson.html
http://sites.google.com/site/gson/gson-user-guide
コード
public class JsonParsing{
public void parse(String jsonLine) {
Gson gson = new GsonBuilder().create();
Data data = gson.fromJson(jsonLine, Data.class);
Translations translations = data.getTranslation();
TranslatedText[] arrayTranslatedText = translations.getArrayTranslatedText(); //this returns an array, based on json string
for(TranslatedText translatedText:arrayTranslatedText )
{
System.out.println(translatedText.getArrayTranslatedText());
}
}
}
public class Data{
private Translations translations;
public Translations getTranslation()
{
return translations;
}
public void setTranslation(Translations translations)
{
this.translations = translations;
}
}
public class Translations
{
private TranslatedText[] translatedText;
public TranslatedText[] getArrayTranslatedText()
{
return translatedText;
}
public void setTranslatedText(TranslatedText[] translatedText)
{
this.translatedText= translatedText;
}
}
public class TranslatedText
{
private String translatedText;
public String getTranslatedText()
{
return translatedText;
}
public void setTranslatedText(String translatedText)
{
this.translatedText = translatedText;
}
}
JsonPathクエリを使用して値を抽出できます。そしてGsonに支援されている JsonSurfer を使えば、あなたの問題は2行のコードで解決することができます!
JsonSurfer jsonSurfer = JsonSurfer.gson();
String result = jsonSurfer.collectOne(jsonLine, String.class, "$.data.translations[0].translatedText");
最初に以下の解析サイトを使用してゲッターとセッターを生成します
http://www.jsonschema2pojo.org/
今Gsonを使う
GettetSetterClass object=new Gson().fromjson(jsonLine,GettetSetterClass.class);
Data、translationTextなどの値を取得するためにオブジェクトを使用します。
1つの方法はJsonObjectを作成し、パラメータを反復処理することです。例えば
JsonObject jobj = new Gson().fromJson(jsonString, JsonObject.class);
その後、次のようにBeanの値を抽出できます。
String fieldValue = jobj.get(fieldName).getAsString();
boolean fieldValue = jobj.get(fieldName).getAsBoolean();
int fieldValue = jobj.get(fieldName).getAsInt();
お役に立てれば。
JsonParser parser = new JsonParser();
JsonObject jo = (JsonObject) parser.parse(data);
JsonElement je = jo.get("some_array");
//Parsing back the string as Array
JsonArray ja = (JsonArray) parser.parse(o.get("some_array").getAsString());
for (JsonElement jo : ja) {
JsonObject j = (JsonObject) jo;
// Your Code, Access json elements as j.get("some_element")
}
このようにJSONを解析する簡単な例
{"some_array": "[\" some_element\":1、\" some_more_element\":2]"、 "some_other_element":3}
1行のコード:
System.out.println(new Gson().fromJson(jsonLine,JsonObject.class).getAsJsonObject().get("data").getAsJsonObject().get("translations").getAsJsonArray().get(0).getAsJsonObject().get("translatedText").getAsString());