12

私はgsonを使用してjsonをJavaBeanに解析しています。私が使用しているAPIの場合、多くのjson結果には、jsonオブジェクトの最初のプロパティとしての結果が含まれています。「gsonの方法」は、ターゲット出力タイプに対して1つのプロパティを持つ同等のラッパーJavaオブジェクトを作成することのようですが、これにより、不要な使い捨てクラスが発生します。これを行うためのベストプラクティスの方法はありますか?

たとえば、解析するには: {"profile":{"username":"nickstreet","first_name":"Nick","last_name":"Street"}}

私がしなければなりません:

public class ParseProfile extends TestCase {
    public void testParseProfile() {
        Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
        String profileJson = "{\"profile\":{\"username\":\"nickstreet\",\"first_name\":\"Nick\",\"last_name\":\"Street\"}}";
        ProfileContainer profileContainer = gson.fromJson(profileJson, ProfileContainer.class);
        Profile profile = profileContainer.getProfile();
        assertEquals("nickstreet", profile.username);
        assertEquals("Nick", profile.firstName);
        assertEquals("Street", profile.lastName);
    }
}

public class ProfileContainer {
    protected Profile profile;

    public Profile getProfile() {
        return profile;
    }

    public void setProfile(Profile profile) {
        this.profile = profile;
    }
}

public class Profile {
    protected String username;
    protected String firstName;
    protected String lastName;

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

もちろん、コンテナを使用する別のアプローチは、標準の文字列解析手法を使用して文字列の外側部分を手動で削除する(つまり、「プロファイル」:{と閉じる}を削除する)ことですが、これは間違ったアプローチのように感じます。

私は次のようなことができるようになりたいです:

Profile p = gson.fromJsonProperty(json, Profile.class, "profile");

この問題は、json文字列をjsonオブジェクトに分割し、このオブジェクトからjsonElementを引き出して、json.fromJson()に渡すことができるはずであることを示しています。ただし、toJsonElement()メソッドはJavaオブジェクトでのみ機能し、json文字列では機能しません。

誰かがより良いアプローチを持っていますか?

4

1 に答える 1

8

私は同じ問題に遭遇しました。基本的に、コンテナ クラスのナンセンスをすべて回避するために行うことは、JSONObject 関数を使用して、逆シリアル化しようとしている内部オブジェクトを取得することです。ずさんなコードで申し訳ありませんが、次のようになります。

GsonBuilder gsonb = new GsonBuilder()
Gson gson = gsonb.create();

JSONObject j;
JSONObject jo;

Profile p = null;

try {

    j = new JSONObject(convertStreamToString(responseStream));
    jo = j.getJSONObject("profile"); // now jo contains only data within "profile"
    p = gson.fromJson(jo.toString(), Profile.class);
    // now p is your deserialized profile object
}catch(Exception e) {
    e.printStackTrace();
}
于 2010-12-15T22:31:28.580 に答える