2016-03-16 4 views
1

Я определяю модели для сериализации/десериализации Gson, и я пытаюсь найти лучший способ, учитывая мой конкретный ответ JSON.Определение модели для Gson с дополнительными атрибутами

Каждый API вызов в моем приложении имеет такой же формат:

  • статуса: статус вызова
  • сообщения: сообщение, если выше статус «ошибка»
  • данные: любые данные, которые пользователь запросил

В моей модели я действительно забочусь только о данных. Например, если пользователь вызывает/get_buddies, я просто хочу получить список всех приятелей. Но я также «забочусь» о статусе, верно? Если по какой-либо причине статус «ошибка» (пользователь не вошел в систему или что-то еще), я хочу сообщить пользователю, что и Toast сообщение (это плохой пример, как это никогда не произойдет) ...

Как создать мою модель, чтобы я мог читать статус и сообщение, но так, чтобы, если я упакую эту модель как JSON на , отправьте, я не упакую их.

Моя первая мысль из моего исследования, чтобы иметь класс с именем GetBuddiesCall

public class GetBuddiesCall { 
    String status; 
    String message; 
    ArrayList<Buddy> buddies; 
} 

, а затем класс Buddy

public class Buddy { 
    String username; 
    String firstName; 
    String lastName; 
    // etc. 
} 

Затем Gson будет смотреть на эти две модели и иметь возможность десериализации соответственно. Затем, при попытке сериализации, я использую только модель Buddy, так как статус и сообщение не нужны для связи клиент-сервер. Есть ли лучший способ, чем это? Я знаю, что есть модификаторы, которые вы можете использовать как переходные, что заставляет Gson смотреть на это поле при упаковке JSON.

Спасибо за любую помощь!

+1

Вы можете исключить поля из сериализации с помощью ключевого слова transient, но я думаю, что это может применяться для обоих преобразований в/из json. – Submersed

ответ

1

Два способа:

  1. Использование @Expose аннотацию явно для всех полей, вы можете выбрать, если каждое поле должно быть только сериализации, просто десериализации или обоих. Обратите внимание, что для этого также необходимо установить GsonBuilder.excludeFieldsWithoutExposeAnnotation(). https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/annotations/Expose.html

  2. Определить стратегию пользовательских исключений: https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/ExclusionStrategy.html

    В простейшем виде такая реализация может поля жесткого кода, чтобы пропустить; более продвинутый, но также гибкий подход будет также определять вашу собственную аннотацию и проводить проверку стратегии исключения для ее присутствия для каждого поля, например. это может быть что-то вроде @ReadOnly или @Exclude(read = true, write = false).

    Обратите внимание, что вы можете установить стратегии экскурсии в сериализации и десериализации независимо друг от друга: https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/GsonBuilder.html#addDeserializationExclusionStrategy(com.google.gson.ExclusionStrategy)

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

+0

Это выглядит отлично, и именно то, что мне нужно. Я рассмотрю оба. Я полностью понимаю разоблачение, и я думаю, что ExclusionStrategy тоже ... Я проверю это как принятое, как только я гарантирую, что эта стратегия работает для меня. Спасибо, JHH! – Brandon

+0

Мое удовольствие. Удачи. – JHH

+0

Если вы посмотрите на документацию по стратегии исключения, они приводят пример определения вашей собственной аннотации (как вы упомянули выше), они делают что-то вроде public @interface FooAnnotation, а в корпусе интерфейса у них есть комментарий // некоторая реализация здесь. Что бы вы туда поместили? Зачем вам что-то делать? В Стратегии исключений он просто проверяет поля с этой аннотацией и игнорирует их, что имеет смысл, но я не вижу, что вы бы вложили в настоящий интерфейс аннотации! – Brandon

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