2013-11-12 2 views
2

Я пытаюсь разобрать JSON файл, и я не могу понять свою ошибку (небольшие примеры работают безотказно)GSON десериализации: вложенная ошибка JSon файл

Song.json

{ 
    "song": { 
     "fileInfo": { 
      "version": "0.1", 
      "createdIn": "PickWorks Studio", 
      "modifiedIn": "PickWorks Studio", 
      "modified": "2010-01-28T13:15:30+01:00" 
     }, 
     "properties": { 
      "authors": [ 
       { 
        "name": "Juri Traktori", 
        "type": "music", 
        "lang": "en" 
       } 
      ], 
      "titles": [ 
       { 
        "title": "Rainy day", 
        "lang": "en", 
        "original": true 
       }, 
       { 
        "title": "Descowe dni", 
        "lang": "pl" 
       } 
      ], 
      "copywright": "Michal Tomanek", 
      "released": "19-03-1993", 
      "transposition": -3, 
      "tempo": { 
       "type": "text/bpm", 
       "value": "moderate/90" 
      }, 
      "key": "A", 
      "version": 0.99, 
      "publisher": "myself", 
      "keywords": [ "grace", "words","amazing"], 
      "verseOrder": "v1 v2 v1 v1 v2", 
      "themes": [ 
       { 
        "theme": "adoration" 
       } 
      ] 
     }, 
     "lyrics": [ 
      { 
       "section": "v1", 
       "lines": [ 
        { 
         "lang": "en", 
         "part": "man", 
         "text": "How <chord name=\"A\"/>great is <br/>your love", 
         "comment": "Sing softly" 
        }, 
        { 
         "lang": "en", 
         "part": "woman", 
         "text": "How great is your love to us" 
        } 
       ] 
      } 
     ] 
    } 
} 

SongType.java: (скорее длинный) http://pastebin.com/uaEY7dty

Когда я, как обычно работают на жидком:

Gson gson = new Gson() ; 
SongType parsed = gson.fromJson(json, SongType.class); 

I t падает ... Я застрял на нем несколько дней и не могу понять.

BTW: Это мой первый вопрос на SO, поэтому, пожалуйста, извините меня, если он не представлен так, как должно быть.

РЕДАКТИРОВАТЬ:

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 692 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172) 
    at com.google.gson.Gson.fromJson(Gson.java:803) 
    at com.google.gson.Gson.fromJson(Gson.java:768) 
    at com.google.gson.Gson.fromJson(Gson.java:717) 
    at com.google.gson.Gson.fromJson(Gson.java:689) 
    at Main.main(Main.java:14) 
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 692 
    at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:165) 

EDIT 2:

1) Композиция теперь статическая 2) Тексты находятся внутри списка (есть несколько секций внутри)

РЕДАКТИРОВАТЬ 3:

import java.util.List; 

public class SongType { 
    public static Song song; 

    public class Song { 
     public FileInfo  fileInfo; 
     public Properties properties; 
     public List<Lyrics> lyrics; 

     public FileInfo getFileInfo()  {return fileInfo;} 
     public Properties getProperties() {return properties;} 
     public List<Lyrics> getLyrics() {return lyrics;} 

     public void setFileInfo(FileInfo fileInfo)  {this.fileInfo = fileInfo;} 
     public void setProperties(Properties properties) {this.properties = properties;} 
     public void setLyrics(List<Lyrics> lyrics)  {this.lyrics  = lyrics;} 
    } 
//code continues here ... 

Но это все еще не работает ... Я пропустил что-то еще?

+1

Можете ли вы поместить сообщение об ошибке в сообщение. В противном случае очень сложно понять, что искать. –

+0

Пожалуйста, добавьте трассировку стека исключений и как именно он сработает. Вы можете сделать это с помощью ссылки «edit» под своим вопросом. – Brian

+0

Какое поле этого класса не может десериализоваться? –

ответ

0

У вас возникли проблемы с полем Lyrics, Gson ожидает объект, но вы предоставите массив (только с объектом).

Это ваш ваш класс:

public class Song { 
       public FileInfo fileInfo; 
       public Properties properties; 
       public Lyrics lyrics; 
       // more rows 

и это ваша непревзойденная часть JSON

"lyrics": [ 
     //more things here  
    ] 

Как вы можете видеть, с квадратной скобкой, начинается новый массив.

Чтобы решить, измените поле lyrics на List<Lyrics>, если вы хотите разобрать его как есть, в противном случае измените свой JSON, если сможете, удалив квадратные скобки. Разумеется, вы должны изменить также геттер и сеттер для поля lyric. С точки зрения кода, изменить следующим образом:

public static class Song { 
     public FileInfo fileInfo; 
     public Properties properties; 
     public List<Lyrics> lyrics; 

     public FileInfo getFileInfo()  {return fileInfo;} 
     public Properties getProperties() {return properties;} 
     public List<Lyrics> getLyrics()     {return lyrics;} 

     public void setFileInfo(FileInfo fileInfo)    {this.fileInfo = fileInfo;} 
     public void setProperties(Properties properties) {this.properties = properties;} 
     public void setLyrics(List<Lyrics> lyrics)      {this.lyrics  = lyrics;} 
} 

Это мое исполнение:

Gson gson = new Gson() ; 
    SongType parsed = gson.fromJson(s, SongType.class); 
    System.out.print(parsed.song.getLyrics().get(0).getLines().get(0).getText()); 

с этим результатом:

How <chord name="A"/>great is <br/>your love 
+0

В оригинальном файле есть более одного объекта внутри текста ... изменил его на список , но ошибка все тот же ... –

+0

В примере, который вы предоставили, есть массив с одной лирикой внутри. Anycase, используйте список текстов – giampaolo

+0

@ user1741772: если вы используете Список и установите их приемник и сеттер соответственно, он будет работать. Я тестировал его локально, как с помощью «GSON», так и с картотекой «Джексон» (которая представляет собой библиотеку, которая делает то же самое). –

0

Есть несколько вопросов здесь.

  1. Тексты песен - это массив в файле JSON, но ваша переменная отсутствует.Измените его на
  2. Внутренний класс Song не является статическим, что может быть проблемой (хотя, видимо, это работает для вас): see here why.
Смежные вопросы