2013-07-26 2 views
1

jackson v1.9.13 spring 3.2.0 Привет, Я проводил дни, пытаясь понять, как добавить поле в JSON из компонента во время сериализации.Весна-MVC Джексон. Добавить поле во время сериализации бобов

Похоже, что это очень простая функция, но я столкнулся с резиновыми стенами по каждому маршруту, который я взял.

То, что я хочу добиться:

пример фасоли:

package org.mydomain; 

public class MyBean implements Serializable { 
    private String foo; 
    public void setFoo(String inValue) { 
     foo = inValue; 
    }  
    public String getFoo() { 
     return foo; 
    } 
} 

выход:

{ 
    "_type" : "org.mydomain.MyBean", 
    "foo" : "bar" 
} 

Я считаю, что Simples способом было бы расширить BeanSerializer запись свойство «_type» и делегировать сериализацию суперкласса остальных полей. Проблема в том, что доступность методов и «заключительная» статья некоторых важнейших методов делает ее трясиной.

Я пробовал расширять BeanSerializerBase, JsonSerializer, BeanSerializerModifier.

Каждый раз, когда я врезался в какой-то непроницаемый 24-аргумент-конструктор или какой-то не-неправильно документированный метод.

Очень расстраивает.

У кого-нибудь есть идеи о том, как достичь вышеуказанного бита?

Я использую spring-mvc, поэтому мне нужно подключаемое решение через конфигурацию ObjectMapper. Я не хочу загрязнять объекты модели или контроллера с помощью json-специфической аннотации или логики сериализации.

Большое спасибо.

Н.

+1

Другим способом для достижения этой цели обсуждается в этом вопросе http://stackoverflow.com/questions/14714328/jackson-how-to-add-custom-property-to-the-json-without-modifying- заместитель POJO –

ответ

-1

Вы можете создать прокси-класс для MyBean и использовать его вместо MyBean. Это не требует изменения исходного класса. Вам просто нужно заменить исходный объект MyBean прокси-объектом. Хотя вы можете использовать, не требуя интерфейса для MyBean, но он чище использовать интерфейс.

package org.mydomain; 
public interface IMyBean{ 
    public String getFoo(); 
} 
public class MyBean implements IMyBean,Serializable { 
    private String foo; 
    public void setFoo(String inValue) { 
     foo = inValue; 
    }  
    public String getFoo() { 
     return foo; 
    } 
} 
public class MyBeanProxy implements IMyBean,Serializable { 

    private IMyBean myBean; 
    private String type; 
    public MyBeanProxy(IMyBean myBean, String type){ 
     this.myBean = myBean; 
     this.type = type; 
    } 

    public String getFoo() { 
     return myBean.getFoo(); 
    } 
    public String getType(){ 
     return type; 
    } 
} 
Смежные вопросы