如何为这个json输入定义gsonjava类

dfuffjeb  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(260)

如何定义json的轨迹来反序列化这个json

  1. "user": {
  2. "authority": "user",
  3. "title": "Renata Tebaldi Serenata Tebaldi [Disc 2]",
  4. "artist": "Renata Tebaldi",
  5. "tracks": {
  6. "1": "Track 01 - BELLINI: Vaga luna che inargenti",
  7. "2": "Track 02 - BELLINI: Per pieta bel ‘idol mio",
  8. "3": "Track 03 - MASCAGNI: M’ama ... Non m’ama",
  9. "4": "Track 04 - RESPIGHI: Notte",
  10. "5": "Track 05 - TOSTI: ‘A vuchella",
  11. "6": "Track 06 - DAVICO: O luna che fa lume",
  12. "7": "Track 07 - DONIZETTI: Me voglio fa ‘na casa",
  13. "8": "Track 08 - MASCAGNI: La tua Stella",
  14. "9": "Track 09 - TOSTI: Sogno",
  15. "10": "Track 10 -ROSSINI: L’invito",
  16. "11": "Track 11 - ZANDONAI: L’assiulo",
  17. "12": "Track 12 - CIMARA: Stormello",
  18. "13": "Track 13 - PONCHIELLI: Noi leggevamo insieme",
  19. "14": "Track 14 - MASCAGNI: Serenato",
  20. "15": "Track 15 - PARISOTTI: Se tu m’ami",
  21. "16": "Track 16 - PARADISI: M’ha presa alla sua ragna",
  22. "17": "Track 17 - SCARLATTI: O cessati di piagarmi",
  23. "18": "Track 18 - GLUCK: O dell mio dolce ardor",
  24. "19": "Track 19 - RICCI: Il carrettiere del Vomero",
  25. "20": "Track 20 - MERCADANTE: La sposa del marinaro",
  26. "21": "Track 21 - BELLINI: Malliconia, ninfa gemtile",
  27. "22": "Track 22 - PUCCINI: E l’luccelino"
  28. }
  29. },

我对用户的定义如下

  1. public class UnitiCoreUser
  2. {
  3. private String authority;
  4. private String artist;
  5. private String title;
  6. public String getAuthority()
  7. {
  8. return authority;
  9. }
  10. public void setAuthority(String authority)
  11. {
  12. this.authority = authority;
  13. }
  14. public String getArtist()
  15. {
  16. return artist;
  17. }
  18. public void setArtist(String artist)
  19. {
  20. this.artist = artist;
  21. }
  22. public String getTitle()
  23. {
  24. return title;
  25. }
  26. public void setTitle(String title)
  27. {
  28. this.title = title;
  29. }
  30. }

我的问题是track,因为其中的元素不是按名称固定的,也就是说它们都是相同的,但是标记为1,2,3,4,。。。所以不能只是有一系列的轨迹。
e、 g轨道[]轨道;

7vux5j2d

7vux5j2d1#

gson的类型适配器可以处理一些奇怪的事情。这些类型适配器可以读/写将它们Map到类或从类Map到类的json元素,并进行一些额外的检查(例如,类似数组的Map验证)。

  1. public final class SequentiveMapTypeAdapterFactory
  2. implements TypeAdapterFactory {
  3. private static final ConstructorConstructor constructorConstructor = new ConstructorConstructor(ImmutableMap.of(
  4. List.class, type -> new ArrayList<>()
  5. ));
  6. private SequentiveMapTypeAdapterFactory() {
  7. }
  8. @Override
  9. @Nullable
  10. public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> typeToken) {
  11. final Class<? super T> rawType = typeToken.getRawType();
  12. if ( !List.class.isAssignableFrom(rawType) ) {
  13. return null;
  14. }
  15. final Type type = typeToken.getType();
  16. final Type elementType = $Gson$Types.getCollectionElementType(type, rawType);
  17. @SuppressWarnings("unchecked")
  18. final TypeAdapter<T> typeAdapter = (TypeAdapter<T>) new SequentiveMapTypeAdapter<>(
  19. (ObjectConstructor<? extends List<Object>>) constructorConstructor.get(typeToken),
  20. (TypeAdapter<Object>) gson.getAdapter(TypeToken.get(elementType))
  21. );
  22. return typeAdapter.nullSafe();
  23. }
  24. private static final class SequentiveMapTypeAdapter<E>
  25. extends TypeAdapter<List<E>> {
  26. private final ObjectConstructor<? extends List<E>> objectConstructor;
  27. private final TypeAdapter<E> elementTypeAdapter;
  28. private SequentiveMapTypeAdapter(final ObjectConstructor<? extends List<E>> objectConstructor, final TypeAdapter<E> elementTypeAdapter) {
  29. this.objectConstructor = objectConstructor;
  30. this.elementTypeAdapter = elementTypeAdapter;
  31. }
  32. @Override
  33. public void write(final JsonWriter out, final List<E> list) {
  34. throw new UnsupportedOperationException();
  35. }
  36. @Override
  37. public List<E> read(final JsonReader in)
  38. throws IOException {
  39. in.beginObject();
  40. final List<E> list = objectConstructor.construct();
  41. for ( int i = 1; in.hasNext(); i++ ) {
  42. final String name = in.nextName();
  43. if ( !name.equals(String.valueOf(i)) ) {
  44. throw new JsonParseException("Expected " + i + " but was name " + name);
  45. }
  46. final E element = elementTypeAdapter.read(in);
  47. list.add(element);
  48. }
  49. in.endObject();
  50. return list;
  51. }
  52. }
  53. }

然后,Map对象应该知道如何通过注解相应的字段将json对象转换为列表或数组:

  1. final class UnitiCoreUser {
  2. String authority;
  3. String artist;
  4. String title;
  5. @JsonAdapter(SequentiveMapTypeAdapterFactory.class)
  6. List<String> tracks;
  7. }

然后它就会起作用:

  1. final UnitiCoreUser unitiCoreUser = gson.fromJson(jsonReader, UnitiCoreUser.class);
  2. for ( final String track : unitiCoreUser.tracks ) {
  3. System.out.println(track);
  4. }

输出:

  1. Track 01 - BELLINI: Vaga luna che inargenti
  2. Track 02 - BELLINI: Per pieta bel idol mio
  3. Track 03 - MASCAGNI: Mama ... Non mama
  4. Track 04 - RESPIGHI: Notte
  5. Track 05 - TOSTI: A vuchella
  6. Track 06 - DAVICO: O luna che fa lume
  7. Track 07 - DONIZETTI: Me voglio fa na casa
  8. Track 08 - MASCAGNI: La tua Stella
  9. Track 09 - TOSTI: Sogno
  10. Track 10 -ROSSINI: Linvito
  11. Track 11 - ZANDONAI: Lassiulo
  12. Track 12 - CIMARA: Stormello
  13. Track 13 - PONCHIELLI: Noi leggevamo insieme
  14. Track 14 - MASCAGNI: Serenato
  15. Track 15 - PARISOTTI: Se tu mami
  16. Track 16 - PARADISI: Mha presa alla sua ragna
  17. Track 17 - SCARLATTI: O cessati di piagarmi
  18. Track 18 - GLUCK: O dell mio dolce ardor
  19. Track 19 - RICCI: Il carrettiere del Vomero
  20. Track 20 - MERCADANTE: La sposa del marinaro
  21. Track 21 - BELLINI: Malliconia, ninfa gemtile
  22. Track 22 - PUCCINI: E lluccelino
展开查看全部
2w3rbyxf

2w3rbyxf2#

尝试使用属性Map<string,string>轨迹

1szpjjfi

1szpjjfi3#

你必须使用

  1. Map<String,String> tracks

它将自动反序列化为Map。

wnvonmuf

wnvonmuf4#

尝试使用 Map :

  1. Map<Integer, String> tracks;

下面是一个示例(您展示的类和您展示的json也不完全匹配):

  1. import com.google.gson.Gson;
  2. import java.util.Map;
  3. public class TestApp {
  4. public TestApp() {
  5. String test = "{\"user\":{\"authority\":\"user\",\"title\":\"Renata Tebaldi Serenata Tebaldi [Disc 2]\",\"artist\":\"Renata Tebaldi\",\"tracks\":{\"1\":\"Track 01 - BELLINI: Vaga luna che inargenti\",\"2\":\"Track 02 - BELLINI: Per pieta bel \u2018idol mio\",\"3\":\"Track 03 - MASCAGNI: M\u2019ama ... Non m\u2019ama\",\"4\":\"Track 04 - RESPIGHI: Notte\",\"5\":\"Track 05 - TOSTI: \u2018A vuchella\",\"6\":\"Track 06 - DAVICO: O luna che fa lume\",\"7\":\"Track 07 - DONIZETTI: Me voglio fa \u2018na casa\",\"8\":\"Track 08 - MASCAGNI: La tua Stella\",\"9\":\"Track 09 - TOSTI: Sogno\",\"10\":\"Track 10 -ROSSINI: L\u2019invito\",\"11\":\"Track 11 - ZANDONAI: L\u2019assiulo\",\"12\":\"Track 12 - CIMARA: Stormello\",\"13\":\"Track 13 - PONCHIELLI: Noi leggevamo insieme\",\"14\":\"Track 14 - MASCAGNI: Serenato\",\"15\":\"Track 15 - PARISOTTI: Se tu m\u2019ami\",\"16\":\"Track 16 - PARADISI: M\u2019ha presa alla sua ragna\",\"17\":\"Track 17 - SCARLATTI: O cessati di piagarmi\",\"18\":\"Track 18 - GLUCK: O dell mio dolce ardor\",\"19\":\"Track 19 - RICCI: Il carrettiere del Vomero\",\"20\":\"Track 20 - MERCADANTE: La sposa del marinaro\",\"21\":\"Track 21 - BELLINI: Malliconia, ninfa gemtile\",\"22\":\"Track 22 - PUCCINI: E l\u2019luccelino\"}}}";
  6. UnitiCoreUser user = new Gson().fromJson(test, UnitiCoreUser.class);
  7. }
  8. public static void main(String[] args) {
  9. new TestApp();
  10. }
  11. public class UnitiCoreUser {
  12. private User user;
  13. public User getUser() {
  14. return user;
  15. }
  16. }
  17. class User {
  18. public String authority;
  19. private String artist;
  20. private String title;
  21. Map<Integer, String> tracks;
  22. public String getAuthority() {
  23. return authority;
  24. }
  25. public void setAuthority(String authority) {
  26. this.authority = authority;
  27. }
  28. public String getArtist() {
  29. return artist;
  30. }
  31. public void setArtist(String artist) {
  32. this.artist = artist;
  33. }
  34. public String getTitle() {
  35. return title;
  36. }
  37. public void setTitle(String title) {
  38. this.title = title;
  39. }
  40. public Map<Integer, String> getTracks() {
  41. return tracks;
  42. }
  43. }
  44. }
展开查看全部

相关问题