Каков самый простой способ синтаксического анализа json с помощью gson, когда анализируемый элемент является элементом строки json?

Я использую gson для синтаксического анализа json в java beans. Для API, который я использую, большое количество результатов json включает результат как первое свойство объекта json. Кажется, что «путь gson» заключается в создании эквивалентного 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": {и закрытие}) с использованием стандартных методов синтаксического анализа строки, но это кажется неправильным подходом.

Я бы хотел быть может сделать что-то вроде:

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

Эта проблема предполагает, что должна быть возможность разбить строку json на объект json, чтобы извлечь jsonElement из этого объекта и передать его в json.fromJson (). Однако метод toJsonElement () работает только с java-объектом, а не с json-строкой.

Есть ли у кого-нибудь лучший подход?

12
задан Paul T. 11 September 2012 в 13:00
поделиться