2012-06-05 6 views
2

Я пишу функцию, которая сериализует объект Java в Json с помощью Gson.Сериализовать объект поля объекта Java с помощью Gson

Проблема заключается в том, что она только сериализует примитивные поля моего класса, но не объекты. Например. У меня есть два класса, как:

class TestClass { 
    public int i = 10; 
    public TestClass2 tc2; 
} 

class TestClass2 { 
    public int j = 20; 
} 

И мой тест:

@Test 
public void shouldSerializeSimpleObjectIntoJson() { 
    TestClass tc = new TestClass(); 

    String json = new Gson().toJson(tc); 
    System.out.println(json); 
} 

Выход Json является:

{"i":10} 

Он не содержит поля tc2.

Как настроить Gson для рекурсивного кодирования объекта в Json?

Благодаря

+0

Имейте 'tc2' как нечто, отличное от' null'. В вашем примере нечего кодировать. –

ответ

3

поле игнорируется, потому что это null. Из documentation:

поведение по умолчанию, реализованный в Gson, что нулевые поля объекта игнорируются. Это позволяет использовать более компактный выходной формат; однако клиент должен определить значение по умолчанию для этих полей, так как формат JSON преобразуется обратно в его Java.

Вот как вы бы настроить экземпляр Gson для вывода нуля:

Gson gson = new GsonBuilder().serializeNulls().create(); 

Если вы установите tc.tc2 на значение, отличное от null, вы должны увидеть его поле в выходном файле.

2

С вашим конкретным примером, добавить конструктор, который сделает новый экземпляр tc2:

public TestClass() 
{ 
    tc2 = new TestClass2(); 
} 

и посмотреть, если это помогает. Если в вашем реальном коде класс, аналогичный TestClass2, также имеет ссылочные классы, также создайте новый экземпляр из них

2

В Java поля объектов по умолчанию не инициализируются, это означает, что поле tc2 будет равно null, если только вы устанавливаете что-то. По умолчанию Gson игнорирует пустые поля и, следовательно, не сериализует его.

Вы можете инициализировать поле в конструкторе, как и в правильном ответе. Или вы также можете его инициализировать следующим образом:

class TestClass { 
    public int i = 10; 
    public TestClass2 tc2 = new TestClass2(); 
} 
Смежные вопросы