2012-02-15 3 views
3

Я пытаюсь разобрать JSON в Object. Существует два класса: «Пользователь» и «Профиль». Пользователь получил экземпляр профиля.Gon deserialization - попытка разобрать JSON на объект

Итак, теперь есть один JSON для создания пользовательского объекта. Внутри этого JSON указаны атрибуты для пользователя и профиля, и, как вы можете видеть, профиль и пользователь получили как HashMap, называемый List. Тем не менее я хотел бы создать пользователь и профиль из этого Json, но я получил это исключение:

// EDIT:

Я удалил Map<String, String> links от профиля и пользователя. Так что теперь я не получаю никаких ошибок, и каждый Пользователь получил профиль, но мне все еще нужны эти Карты. Возможно ли, что GSON не может различать два списка ressources внутри json, потому что они имеют одно и то же имя?

// Dirty Hack ArrayList вместо HashMap не представляет проблемы. Однако я решил разобрать эту часть Json "вручную", чтобы вставить объекты в мой HashMap ..

01-03 05:27:59.580: E/AndroidRuntime(4313): com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 12 
01-03 05:27:59.580: E/AndroidRuntime(4313):  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:180) 

Пользователь:

public class User { 
    private String username; 
    private String slug; 
    private String email; 
    private Boolean emailVerified; 
    private Profile profile; 
    Map<String, String> links; 
    public User() 
    { 
     this.username = null; 
     this.slug = null; 
     this.email = null; 
     this.emailVerified = null; 
     this.profile = null; 
     this.links = new HashMap<String, String>(); 
    } 

    public String getUsername(){ 
     return this.username; 
    } 

    public String getSlug(){ 
     return this.slug; 
    } 

    public String getEmail(){ 
     return this.email; 
    } 

    public Boolean getEmailVerified(){ 
     return this.emailVerified; 
    } 

    public Profile getProfile(){ 
     return this.profile; 
    } 
} 

Профиль:

public class Profile { 

    private Map<String, String> links; 
    private String name; 
    private String description; 
    private String gender; 
    private String status; 
    private String timezone; 
    private Bitmap icon; 

    public Profile() 
    { 
     this.name = null; 
     this.description = null; 
     this.gender = null; 
     this.status = null; 
     this.timezone = null; 
     this.links = new HashMap<String, String>(); 
    } 

    public String getName(){ 
     return this.name; 
    } 

    public String getDescription(){ 
     return this.description; 
    } 

    public String getGender(){ 
     return this.gender; 
    } 

    public String getStatus(){ 
     return this.status; 
    } 

    public String getTimezone(){ 
     return this.timezone; 
    } 
} 

Пример JSON:

{ "email" : "[email protected]", 
    "emailVerified" : true, 
    "links" : [ { "href" : "http://xxx.de/api/users/4f3a73004bb67751bc000011", 
     "rel" : "self" 
     }, 
     { "href" : "http://xxx.de:/api/users/4f3a73004bb67751bc000011/followers", 
     "rel" : "https://xxx.com/rels/collection/follower" 
     }, 
     { "href" : "http://xxx.de/api/users/4f3a73004bb67751bc000011/friends", 
     "rel" : "https://xxx.com/rels/collection/friend" 
     }, 
     { "href" : "http://xxx.de/api/users/4f3a73004bb67751bc000011/activity_stream", 
     "rel" : "https://xxx.com/rels/activity_stream" 
     } 
    ], 
    "profile" : { "description" : "", 
     "gender" : "male", 
     "links" : [ { "href" : "xxx.de/uploads/profile_images/xxx.png", 
      "rel" : "https://xxx.com/rels/image" 
      }, 
      { "href" : "http://xxx.de/api/users/xxx/profile", 
      "rel" : "self" 
      } 
     ], 
     "name" : "Foo Bar", 
     "status" : "Status", 
     "timezone" : "CET" 
    }, 
    "slug" : "foobaar", 
    "username" : "foobaar" 
} 

Доступ: Метод:

public static User parseUser(String json) { 
     JSONObject jsonObject; 
     Gson gson = new Gson(); 

     try { 
      jsonObject = new JSONObject(json); 
      Log.v(TAG,jsonObject.toString(2)); 
      User u = gson.fromJson(jsonObject.toString(), User.class); 
      return u; 

     } catch (JSONException e){ 
      Log.e(TAG, "There was an error parsing the JSON (USER)" + e); 
     } 
     return null; 
    } 

Где моя ошибка? И могу ли я использовать HashMap, как это, с помощью GSON? Заранее спасибо

ответ

2

Используйте класс Deserializer Gson. они довольно просты:

Для выполнения этой работы вы должны убедиться, что анализатор не собирается сериализовать объект-нарушитель (в данном случае вашу карту). Я бы переименовал ваш объект карты в _links или somesuch, поэтому сериализатор пропустит его. Сделайте то же самое, что и этот пример для своего профиля.

После того, как вы сделали, что вы должны десериализации его и убедитесь, что включить десериализации в объекте gson:

User u; 
    GsonBuilder gb = new GsonBuilder(); 
    gb.registerTypeAdapter(User.class, new UserDeserializer()); 
    Gson g = gb.create(); 
    u = g.fromJson(json, User.class); 


public class UserDeserializer implements JsonDeserializer<UserDeserializer> 
{ 
    @Override 
    public User deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
    { 
     User u = g.fromJson(json, User.class); 
     JsonObject jo = (JsonObject)json; 
     JsonElement je = jo.get("links"); 
     //iterate through the je element to fill your map. 
    } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^