web-dev-qa-db-ja.com

JSON文字列をJava object?

私は、JSON文字列をJavaオブジェクトに変換することに関連する例を探していましたが、良い例は見つかりませんでした。

Google翻訳APIを使用して、文字列を英語からさまざまな言語に翻訳するアプリを作成しています。クエリに対するGoogleの応答は... foolowing textはJSON形式であり、

{"data":{"translations":[{"translatedText":"Bonjour tout le monde"}]}} 

私のこれまでのアプローチはGSON APIを使用していますが、この複雑な結果をどのように操作してJavaオブジェクト?

My Java class is ...

import com.google.gson.Gson;

public class JSONConverter {

private String traslatedText;

/**
 * Create an object of it self by manipulating json string
 * @param json type: String
 * @return String Translated text result from JSON responce
 */
public String getTranslation(String json){  
    Gson gson = new Gson();
    JSONConverter obj = gson.fromJson(json, JSONConverter.class);

    return obj.getTranslationForReturn();
}

/**
 * Method return a translation to a private call
 * @return String translation
 */
private String getTranslationForReturn(){
    return this.traslatedText;
 }
}

上記のアプローチは、「Bonjour tout le monde」が返されないので機能しません。

誰かが私の理解を広めることができたら、とてもうれしいです。

23
TeaCupApp

編集:JavaデータクラスがJSONの正確なモデルである必要があります。

{"data":{"translations":[{"translatedText":"Bonjour tout le monde"}]}} 

になる:

class DataWrapper {
    public Data data;

    public static DataWrapper fromJson(String s) {
        return new Gson().fromJson(s, DataWrapper.class);
    }
    public String toString() {
        return new Gson().toJson(this);
    }
}
class Data {
    public List<Translation> translations;
}
class Translation { 
    public String translatedText;
}

オブジェクトモデルがより複雑になると、org.jsonスタイルのコードは読み取り不能になりますが、gson/jacksonスタイルのオブジェクトマッピングは単純なJavaオブジェクトです。

26
Kevin

私は通常、プレーン org.jsonライブラリ を使用するのが好きです

次のように使用します。

 // make sure the quotes are escaped
String str = "{\"data\":{\"translations\":[{\"translatedText\":\"Bonjour tout le monde\"}]}}";
 // the object data is inside a "global" JSONObject
data = new JSONObject(str).getJSONObject("data");
// get a JSONArray from inside an object
JSONArray translations = data.getJSONArray("translations");
// get the first JSONObject from the array
JSONObject text = translations.getJSONObject(0);
// get the String contained in the object -> logs Bonjour tout le monde
Log.d("***>Text", text.getString("translatedText"));

たぶん、あまりにも多くのコードが、私が望んでいたものよりも明確ではありません。これは私がやろうとする機能です:

public String getTranslation(String json){  
  JSONObject data = new JSONObject(json).getJSONObject("data");
  return data.getJSONArray("translations").getJSONObject(0).getString("translatedText");
}
11
Aleadam

これを確認してください JSONからJavaへの変換 、クラスをオブジェクトとして定義し、それを渡すことができると思います。そのため、クラスを作成して渡します。

Data obj = gson.fromJson(json, Data.class);

class Data{
  public List<Data> getTranslation(){
     return translations;
  }
}

そのようなものを試してみてください。少し実験する必要があるかもしれません。

10
Matt