Я использую 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-строкой.
Есть ли у кого-нибудь лучший подход?