2016-09-16 7 views
1

Я хотел бы попросить помощи, чтобы сделать мой код чище.Атрибут Parse PoJo JSON String как объект

У меня есть этот Pojos, например:

class A { 
    B b; 
} 

class B { 
    int a; 
    int b; 
} 

данные поступают из запроса HTTP и тело JSON. Я хочу проанализировать это как класс A, указав атрибут b как строку JSON, как показано ниже.

{ 
    "b":"{\"a\":1,\"b\":2}" 
} 

В настоящее время я использую пользовательский синтаксический анализ через ObjectMapper от Jackson, и я действительно оцениваю проверку вручную. Можно ли применить некоторую аннотацию к атрибуту «b», который означает, что это сложный атрибут, заключенный в строку?

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

+0

Там нет необходимости делать это. Джексон понимает вложенные объекты и десериализует объект 'A' правильно, поэтому он будет содержать фактический экземпляр' B'. – ike3

+0

Если я позволю Джексону выполнить десериализацию, он будет жаловаться на отсутствующий конструктор в B с одним вводом String. Я надеюсь, что есть способ сказать Джексону обработать форматированную строку JSON как объект JSON. – m3dw3

+0

Кажется, ваш JSON искажен. Вы можете удалить кавычки «b»: {\ "a \": 1, \ "b \": 2} '? Из-за этого Джексон десериализует его как String. Если этот формат предназначен (что не рекомендуется), тогда вы можете создать конструктор, который Джексон хочет и десериализует String. – ike3

ответ

2

Создать пользовательский конструктор с чем-то вроде этого:

class B { 
    public B() {} 
    public B(String value) { 
     B b = new ObjectMapper().readValue(value, B.class); 
     this.a = b.a; 
     this.b = b.b; 
    } 
    int a; 
    int b; 
} 

Другим решением clould будет написать собственный десериализатор для B

+1

Это хорошее решение, но я с нетерпением жду, если Джексон справится с этим через аннотацию. И не забывайте обрабатывать IOException здесь. – m3dw3