2013-01-31 3 views
4

У меня есть список объектов, скажем:Как представить целое число в шестнадцатеричном формате с помощью Gson?

List<Timestamp> 

Каждый объект «Отметка» включает в себя другие объекты, в частности, он имеет «Tag» объект.

class Timestamp { 
    String time; 
    ... 
    Tag tag; 
    ... 
} 

Теперь каждый объект Tag идентифицируется идентификатором типа «Целое число».

class Tag { 
    Integer id; 
    ... 
} 

По несколько причин, я должен написать представление JSON из всего списка меток времени в файл с помощью библиотеки Gson. В некоторых случаях мне нужно десятичное представление идентификатора каждого тега, тогда как в других случаях мне нужны идентификаторы в шестнадцатеричном формате.

Как я могу «переключиться» между двумя форматами? Считаю, что написать весь список объектов Timestamp я использую следующую инструкцию:

ps.println(gson.toJson(timestamps)); 

и я не могу добавить другие поля/тип/объектов в классе тегов, так как представление JSON будет отличаться.

+0

Это похоже на проблему без проблем, если вы правильно меня поняли? Если при преобразовании в JSON вы хотите, чтобы 'id' был целым числом, это будет. Итак ... когда вы не конвертируете его в JSON и не нуждаетесь в шестнадцатеричном представлении ('String'), просто преобразуйте' id' в это. –

+0

Проблема в том, что у меня есть файл журнала, где идентификаторы могут быть целыми или шестнадцатеричными числами. В моем java-коде у меня есть классы для связывания моих проанализированных объектов. Один из этого класса - тег, где по некоторым причинам идентификатор должен быть целым числом. Но что происходит, когда файл журнала имеет идентификаторы в шестнадцатеричном формате? Я могу разделить их на целое число (согласно моему тегу), но мне нужно экспортировать их обратно в шестнадцатеричные числа. –

ответ

1

Я думаю, что это ответ:

  1. написать собственный gson сериалайзер для класса Tag.
  2. Добавьте переменную flag в тег, которая указывает, когда выводить идентификатор в шестнадцатеричном формате и когда вывести идентификатор в десятичном формате.
  3. Создайте метод toString() в классе Tag, который обращает внимание на вновь добавленный флаг.

Пользовательских Serializer (вариация на примере gson док)

private class TagSerializer implements JsonSerializer<Tag> 
{ 
    public JsonElement serialize(Tag src, Type typeOfSrc, JsonSerializationContext context) 
    { 
    return new JsonPrimitive(src.toString()); 
    } 
} 

Регистрация настраиваемого сериалайзер

GsonBuilder gson = new GsonBuilder(); 
gson.registerTypeAdapter(Tag.class, new TagSerializer()); 

Тэг Обновления

boolean displayIdInHex = false; 

public void setDisplayIdInDecimal() 
{ 
    displayIdInHex = false; 
} 

public void setDisplayIdInHex() 
{ 
    displayIdInHex = true; 
} 

public String toString() 
{ 
    ... stuff ... 
    if (displayIdInHex) 
    { 
    ... output id in hex. 
    } 
    else 
    { 
    ... output id in decimal. 
    } 
} 

TimeStamp Обновление общественное недействительное setDisplayIdInDeci mal() { tag.setDisplayIdInDecimal(); }

public void setDisplayIdInHex() 
{ 
    tag.setDisplayIdInHex(); 
} 
+0

, reuslt будет' String' в вашем json-объекте, например {id: "32A44C"} – Fusselchen

+0

Большое спасибо! –

1

Integer сам не имеет формата, это всего лишь число.
Если вы хотите иметь его в шестнадцатеричном формате, вы должны использовать String вместо Integer.

+0

Да, я знаю, но, к сожалению, я не могу использовать String. Мне нужно Integer для представления JSON, за исключением случаев с идентификаторами HEX. –

+1

Если вы не можете использовать 'String', вы не можете использовать шестнадцатеричный. Шестнадцатеричный * - это строка. Другого способа представить его нет. (См. Http://www.json.org/ страницу поиска для «шестнадцатеричного»). –

+0

Я имею в виду, я не могу использовать String непосредственно в моем классе Tag, но если есть способ изменить мой ID из Integer на String во время процесса записи, это может быть хорошо. –

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