2013-06-26 4 views
4

У меня есть объект JSON как это:Анализировать Список объектов JSON с помощью GSON

{ 
    "user1": { 
    "timeSpent": "20.533333333333335h", 
    "worklog": [ 
     { 
     "date": "06/26/2013", 
     "issues": [ 
      { 
      "issueCode": "COC-2", 
      "comment": "\ncccccc", 
      "timeSpent": "20.533333333333335h" 
      } 
     ], 
     "dayTotal": "20.533333333333335h" 
     } 
    ] 
    }, 
    "admin": { 
    "timeSpent": "601.1h", 
    "worklog": [ 
     { 
     "date": "06/25/2013", 
     "issues": [ 
      { 
      "issueCode": "COC-1", 
      "comment": "", 
      "timeSpent": "113.1h" 
      } 
     ], 
     "dayTotal": "113.1h" 
     }, 
     { 
     "date": "06/26/2013", 
     "issues": [ 
      { 
      "issueCode": "COC-1", 
      "comment": "", 
      "timeSpent": "8h" 
      }, 
      { 
      "issueCode": "COC-2", 
      "comment": "", 
      "timeSpent": "480h" 
      } 
     ], 
     "dayTotal": "488h" 
     } 
    ] 
    } 
} 

и пытается разобрать его с Gson:

Gson gson = new Gson(); 
Book responseBean = gson.fromJson(jsonString, Book.class); 

Но «responceBean» всегда «нулевой»

Вот все остальные классы:

public class Book { 

    private List<User> user = new LinkedList<User>(); 

    public List<User> getUser() { 
     return user; 
    } 

    public void setUser(List<User> user) { 
     this.user = user; 
    } 
} 

public class User { 
    private String timeSpent; 
    private List<WorkLog> worklogs = new LinkedList<WorkLog>();; 

    public List<WorkLog> getWorklogs() { 
     return worklogs; 
    } 

    public void setWorklogs(List<WorkLog> worklogs) { 
     this.worklogs = worklogs; 
    } 

    public String getTimeSpent() { 
     return timeSpent; 
    } 

    public void setTimeSpent(String timeSpent) { 
     this.timeSpent = timeSpent; 
    } 
} 

public class WorkLog{ 
    private String date; 
    private String dayTotal; 
    private List<Issues> issues; 

    public String getDate(){ 
     return this.date; 
    } 
    public void setDate(String date){ 
     this.date = date; 
    } 
    public String getDayTotal(){ 
     return this.dayTotal; 
    } 
    public void setDayTotal(String dayTotal){ 
     this.dayTotal = dayTotal; 
    } 
    public List<Issues> getIssues(){ 
     return this.issues; 
    } 
    public void setIssues(List<Issues> issues){ 
     this.issues = issues; 
    } 
} 

public class Issues{ 
    private String comment; 
    private String issueCode; 
    private String timeSpent; 

    public String getComment(){ 
     return this.comment; 
    } 
    public void setComment(String comment){ 
     this.comment = comment; 
    } 
    public String getIssueCode(){ 
     return this.issueCode; 
    } 
    public void setIssueCode(String issueCode){ 
     this.issueCode = issueCode; 
    } 
    public String getTimeSpent(){ 
     return this.timeSpent; 
    } 
    public void setTimeSpent(String timeSpent){ 
     this.timeSpent = timeSpent; 
    } 
} 

Это моя последняя попытка. Почему-то я не могу понять правильный путь. Будем очень благодарны за любую помощь.

+2

Не уверен, но, похоже, у вас есть список пользователей, а не один пользователь. Как вы ожидаете, что это будет отображаться? –

+0

Возможный дубликат [Gson fromJson() возвращает объект с нулевыми attrubutes] (http://stackoverflow.com/questions/16210787/gson-fromjson-returns-object-with-null-attrubutes) – dablak

+0

Спасибо Эрик, я изменил сообщение , Я также закрепил его списком, все еще ничего не отображал. – ITisha

ответ

10

Ваш Модель JSON не соответствует вашей объектной модели.

Вам нужен промежуточный слой, чтобы заполнить пробел: а TypeAdapter.

Кроме того, для пользователя нет информации для именования.

И, наконец, есть несоответствие имени: «worklog» в JSON, «worklogs» в Java.

Вот фиксированная версия:

Java модель:

class User { 
    private String timeSpent; 
    @SerializedName("worklog") 
    private List<WorkLog> worklogs = new LinkedList<WorkLog>(); 
    private String name; 

    public List<WorkLog> getWorklogs() { 
     return worklogs; 
    } 

    public void setWorklog(List<WorkLog> worklogs) { 
     this.worklogs = worklogs; 
    } 

    public String getTimeSpent() { 
     return timeSpent; 
    } 

    public void setTimeSpent(String timeSpent) { 
     this.timeSpent = timeSpent; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

Сантехника, чтобы заполнить пробел:

class BookTypeAdapter implements JsonSerializer<Book>, JsonDeserializer<Book> 
{ 
     Gson gson = new Gson(); 

     public JsonElement serialize(Book book, Type typeOfT, JsonSerializationContext context) 
     { 
      JsonObject json = new JsonObject(); 

      for (User user : book.getUser()) 
      { 
       json.addProperty(user.getName(), gson.toJson(user)); 
      } 

      return json; 
     } 

     public Book deserialize(JsonElement element, Type typeOfT, JsonDeserializationContext context) throws JsonParseException 
     { 
      JsonObject json = element.getAsJsonObject(); 

      Book book = new Book(); 

      for (Entry<String, JsonElement> entry : json.entrySet()) 
      { 
       String name = entry.getKey(); 
       User user = gson.fromJson(entry.getValue(), User.class); 
       user.setName(name); 

       book.getUser().add(user); 
      } 

      return book; 
     } 
} 

И следующее:

GsonBuilder builder = new GsonBuilder(); 
builder.registerTypeAdapter(Book.class, new BookTypeAdapter()); 

Gson gson = builder.create(); 

Book book = gson.fromJson("{" + 
     " \"user1\": {" + 
     " \"timeSpent\": \"20.533333333333335h\"," + 
     " \"worklog\": [" + 
     "  {" + 
     "  \"date\": \"06/26/2013\"," + 
     "  \"issues\": [" + 
     "   {" + 
     "   \"issueCode\": \"COC-2\"," + 
     "   \"comment\": \"\ncccccc\"," + 
     "   \"timeSpent\": \"20.533333333333335h\"" + 
     "   }" + 
     "  ]," + 
     "  \"dayTotal\": \"20.533333333333335h\"" + 
     "  }" + 
     " ]" + 
     " }," + 
     " \"admin\": {" + 
     " \"timeSpent\": \"601.1h\"," + 
     " \"worklog\": [" + 
     "  {" + 
     "  \"date\": \"06/25/2013\"," + 
     "  \"issues\": [" + 
     "   {" + 
     "   \"issueCode\": \"COC-1\"," + 
     "   \"comment\": \"\"," + 
     "   \"timeSpent\": \"113.1h\"" + 
     "   }" + 
     "  ]," + 
     "  \"dayTotal\": \"113.1h\"" + 
     "  }," + 
     "  {" + 
     "  \"date\": \"06/26/2013\"," + 
     "  \"issues\": [" + 
     "   {" + 
     "   \"issueCode\": \"COC-1\"," + 
     "   \"comment\": \"\"," + 
     "   \"timeSpent\": \"8h\"" + 
     "   }," + 
     "   {" + 
     "   \"issueCode\": \"COC-2\"," + 
     "   \"comment\": \"\"," + 
     "   \"timeSpent\": \"480h\"" + 
     "   }" + 
     "  ]," + 
     "  \"dayTotal\": \"488h\"" + 
     "  }" + 
     " ]" + 
     " }" + 
     "}", Book.class); 

String json = gson.toJson(book); 

Have посмотрите мой учебник на g et an идея о том, что возможно с Gson: Java/JSON mapping with Gson

Наслаждайтесь! :)

+0

Большое спасибо Pragmateek! Вера в человечество: выздоровел =) – ITisha

+1

Рад помочь! :) – Pragmateek

0

У меня была проблема до месяца. Насколько я помню, это было потому, что, как и вы, я забыл сделать «новое» для объектов. Я имею в виду, что это должно выглядеть так:

public class User { 
    private String timeSpent; 
    private List<WorkLog> worklogs = new List <WorkLog>(); 
} 

Попробуйте это, и я надеюсь, что это поможет.

P.S. Также, как сказал Эрик Прагт, у вас есть массив пользователей, а не один. Поэтому вам нужно будет сделать еще 1 класс, содержащий список < Пользователи>.

+0

Спасибо Kamen. Я пробовал то, что вы предлагаете, и все еще ничего не отображается. – ITisha

+0

Попытайтесь изменить самые первые и самые последние символы от {} до []. "[]" сообщает Gson, что это массив. –

+0

Это сделало бы * абсолютно * никакой разницы. –