2016-02-18 2 views
0

У меня есть JSON:Mapping Json массив с объектами как имена String (Java)

{ 
    "albums": [ 
    { 
     "default": { 
     "privacy": "public" 
      ...... 
     } 
     } 
    }, 
    { 
     "second_album": { 
     "privacy": "public" 
     ...... 
     } 
    }, 
    { 
     "third_album": { 
     "privacy": "public" 
     ...... 
     } 
    } 
    } 
    ] 
} 

Я хочу сделать объекты Java для этого JSON.

public class AlbumsResponse { 

    private List<Album> albums = new ArrayList<>(); 

    public List<Album> getAlbums() { 
     return albums; 
    } 

    public void setAlbums(List<Album> albums) { 
     this.albums = albums; 
    } 
} 

и

public class Album { 

    private Title title; 

    public Title getTitle() { 
     return title; 
    } 

    public void setTitle(Title title) { 
     this.title = title; 
    } 

} 

Но, как вы можете видеть Альбом не имеет каких-либо поле «Заголовок» в формате JSON, но есть что-то вроде этого

"second_album": { 
    "privacy": "public" 
    ...... 
    } 

Как работать с этим? Как преобразовать имя json-объекта в качестве единицы в json-array в поле «title» в java-объекте?

+0

Вы можете использовать библиотеку Джексона https://github.com/FasterXML/jackson-databind –

+0

Я не понимаю, как именно я могу это сделать. И мне нужно сделать это с Гсоном. –

ответ

0

Основываясь на вашем вопросе, я не совсем уверен, как вы хотите преобразовать объект, указанный в Title, но я считаю, что вы можете достичь того, что ищете, с помощью custom deserializer.

Например, следующий десериализатор принимает первый ключ объекта JSON, оборачивает это в Title, а затем возвращает Album с этим Title:

public static class AlbumDeserializer implements JsonDeserializer<Album> { 
    @Override 
    public Album deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     // Get the key of the first entry of the JSON object 
     JsonObject jsonObject = json.getAsJsonObject(); 
     Map.Entry<String, JsonElement> firstEntry = jsonObject.entrySet().iterator().next(); 
     String firstEntryKey = firstEntry.getKey(); 

     // Create a Title instance using this key as the title 
     Title title = new Title(); 
     title.setTitle(firstEntryKey); 

     // Create an Album instance using this Title 
     Album album = new Album(); 
     album.setTitle(title); 
     return album; 
    } 
} 

Вы можете зарегистрировать собственный десериализатор с вашим Gson экземпляра, и преобразовать JSON с ним:

Gson gson = new GsonBuilder() 
     .registerTypeAdapter(Album.class, new AlbumDeserializer()) 
     .create(); 

AlbumsResponse response = gson.fromJson(json, AlbumsResponse.class); 

System.out.println(response); 

Предполагая, что ваши классы реализуют toString в основном способе, работает это остроумие ч ваш пример выводит следующее:

AlbumsResponse{albums=[Album{title=Title{title='default'}}, Album{title=Title{title='second_album'}}, Album{title=Title{title='third_album'}}]} 
Смежные вопросы