2014-09-24 2 views
1

У меня возникли проблемы десериализации пользовательского объекта с помощью gson. У меня есть этот класс:Модернизация: стандартная десериализация детского списка GSON

public class Content implements java.io.Serializable { 

    private Long id; 
    private int tipo; 
    private String title; 
    private String content; 
    private Integer reward; 
    /** Not-null value. */ 
    private String imageUrl; 
    private String bannerUrl; 
    private String logoUrl; 
    /** Not-null value. */ 
    private String actionUrl; 
    private Integer templateType; 
    private String expiresAt; 
    private Integer unlockReward; 
    private Integer reportType; 
    private String completionType; 
    private Integer interactionType; 
    private Integer productId; 
    private Integer views; 
    private Boolean saved; 
    private Double weight; 

    /** Used to resolve relations */ 
    private transient DaoSession daoSession; 

    /** Used for active entity operations. */ 
    private transient ContentDao myDao; 

    private List<Rule> ruleList; 
    private List<Category> categoryList; 
    ... 
    // all getters and setters code 
    ... 
} 

То, что я хочу, чтобы десериализации categoryList с помощью пользовательского адаптера. Я создал его, используя следующий код:

Type typeOfListOfCategory = new com.google.gson.reflect.TypeToken<List<Category>>(){}.getType(); 
builder.registerTypeAdapter(typeOfListOfCategory, new JsonDeserializer<List<Category>>() { 
    @Override 
    public List<Category> deserialize(JsonElement element, Type type, 
     JsonDeserializationContext context) throws JsonParseException { 
    // my code goes in here 
    } 
}); 
Gson gson = builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); 

И тогда я использовал его в выходной адаптер

RestAdapter restAdapter = new RestAdapter.Builder() 
    .setEndpoint("http://localhost/api") 
    .setConverter(new GsonConverter(gson)).build(); 

Но мой пользовательский адаптер никогда не вызывается.

, что JSON я получаю, как это:

[ 
    { 
     "id": 1, 
     "tipo": 1, 
     "title": "title", 
     "content": "content", 
     "reward": 2.0, 
     "image_url": "url1", 
     "banner_url": "url2", 
     "logo_url": "url3", 
     "action_url": "url4", 
     "template_type": 0, 
     "expires_at": "2014-08-31T00:00:00.000Z", 
     "unlock_reward": 2, 
     "report_type": 0, 
     "completion_type": 0, 
     "rules": [ 
      { 
       "range": "1", 
       "operator": "==", 
       "key": "key1" 
      } 
     ], 
     "categories": [ 
      { 
       "description": "description" 
      } 
     ] 
    }, 
    ... 
] 

Любые идеи?

ответ

1

Если вы не используете annotation, чтобы пометить поле Name поля JSON, ваше поле должно совпадать с именем поля JSON. Например, список List<Rule> ruleList в вашем классе java должен быть List<Rule> rules, так как имя списка в JSON равно rules. Перекрестите все имена полей.

Это только моя догадка, потому что вы только что сказали, что у вас проблемы с десериализацией, которая очень очень неопределенная. Если это решение не работает, отправьте сообщение об ошибке, обновив свой вопрос.

+0

Спасибо. Вы были правы относительно списка правил и списка категорий. Другие поля (например, actionUrl) в порядке, учитывая FieldNamingPolicy :). Я приму свой ответ, как только смогу. – gfhuertac

+0

Более половины ваших полей ошибочно названы. для конвертера JSON изменения именования изменяются в Java. поле должно быть строчным с подчеркиванием в качестве разделителя. – Jimmy

+0

Как я уже говорил в своем предыдущем комментарии, только поля списка были названы неправильными. Остальные в порядке, учитывая политику именования (которая автоматически преобразует поля в стандарт Java). – gfhuertac

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