GSON преобразует строку json в объект;получать нули и 0 - PullRequest
1 голос
/ 30 декабря 2011

У меня проблемы с попыткой десериализации строки JSON. Я использую gson

Это класс

public class Notebook {

  public static String DESCRIPTION = "description";

  @SerializedName("id")                 private long id;
  @SerializedName("user_id")            private long userId;
  @SerializedName("description")        private String description;
  @SerializedName("created_at")         private String railsCreated;
  @SerializedName("updated_at")         private String railsUpdated;    
  @SerializedName("created_android")    private String androidCreated;
  @SerializedName("updated_android")    private String androidUpdated;  
  private List<Note> notes;
  private boolean isUploaded = false;

  /*constructors, getters, and setters */

  public static void uploadNotebook(Notebook notebook) {
    MultipartEntity entity = new MultipartEntity();
    HttpResponse response;
    Notebook updatedNotebook = new Notebook();
    Gson gson = new Gson();
    try {
    StringBody description = new StringBody(notebook.getDescription());
    StringBody user = new StringBody("1");
    StringBody format = new StringBody("json");
//      StringBody androidCreated = new StringBody(notebook.getAndroidCreated().toString());
//      StringBody androidUpdated = new StringBody(notebook.getAndroidUpdated().toString());
    entity.addPart("description", description);
    entity.addPart("user_id", user);
    entity.addPart("format", format);
//          entity.addPart("android_created", androidCreated);
//          entity.addPart("android_updated", androidUpdated);
    response = WebService.postRequest(entity, WebService.POST_NOTEBOOK_URL);
    String json = EntityUtils.toString(response.getEntity());
    Log.i("Note Uploader", json);
    updatedNotebook = gson.fromJson(json, Notebook.class);
    if(updatedNotebook != null) {
        Log.i("Notebook ID", ""+updatedNotebook.getId());
        Log.i("Notebook userID", ""+updatedNotebook.getUserId());
        Log.i("Notebook Title", ""+updatedNotebook.getDescription());
        Log.i("Notebook CreatedAt", ""+updatedNotebook.getRailsCreated());
        Log.i("Notebook UpdatedAt", ""+updatedNotebook.getRailsUpdated());
        updatedNotebook.setUploaded(true);
    }
    } catch (UnsupportedEncodingException e) {
      Log.i("Note Uploader", e.getMessage());
    } catch (ClientProtocolException e) {
      Log.i("Note Uploader", e.getMessage());
    } catch (IOException e) {
      Log.i("Note Uploader", e.getMessage());
    }
  }
}

Rails отвечает следующим объектом json при публикации сообщения:

{
  "notebook":{
  "created_android":null,
  "created_at":"2011-12-30T06:35:42Z",
  "description":"Tatata",
  "id":12,
  "updated_android":null,
  "updated_at":"2011-12-30T06:35:42Z",
  "user_id":1
 }
}

Но это то, что я получаю, когда пытаюсь напечатать updatedNotebook полей.

12-30 14:35:42.673: INFO/Notebook ID(551): 0
12-30 14:35:42.673: INFO/Notebook userID(551): 0
12-30 14:35:42.673: INFO/Notebook Title(551): null
12-30 14:35:42.673: INFO/Notebook CreatedAt(551): null
12-30 14:35:42.673: INFO/Notebook UpdatedAt(551): null

Я, наверное, что-то упустил ...

Ответы [ 3 ]

4 голосов
/ 30 декабря 2011

Ваш класс не соответствует JSON.

Ваш JSON - это объект, который содержит одно поле («блокнот»), в качестве значения которого объект содержит поля, которые вы на самом деле ищете.

JSON должен выглядеть следующим образом:

{
  "created_android":null,
  "created_at":"2011-12-30T06:35:42Z",
  "description":"Tatata",
  "id":12,
  "updated_android":null,
  "updated_at":"2011-12-30T06:35:42Z",
  "user_id":1
}

Чтобы правильно отобразить ваш объект. У вас также есть несоответствующие имена полей, которые необходимо исправить . Похоже, вы их получили.

Редактировать: Чтобы уточнить, JSON, который у вас сейчас есть, теперь соответствует этому:

public class NotebookContainer
{
    public Notebook notebook;
}
1 голос
/ 22 октября 2015

Другой подход: если у вас есть контроль над дампом Rails, вы можете игнорировать корневой элемент с помощью ActiveRecord::Base.include_root_in_json = false до того, как начнете генерировать json с помощью to_json

1 голос
/ 30 декабря 2011

Я заметил, что некоторые из ваших сериализованных имен не соответствуют json.android_created и android_updated должны сначала иметь обновленное значение, соответствующее json.Здесь могут быть и другие проблемы, но это проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...