【问题标题】:serialize a LazyDynaList of DynaBean using Jackson JAXRS provider使用 Jackson JAXRS 提供程序序列化 DynaBean 的 LazyDynaList
【发布时间】:2016-04-25 12:42:47
【问题描述】:

我在我的 JEE 应用程序中使用 Jackson JAXRS JSON 提供程序。

compile group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version: '2.7.3'

我需要发送一个List<?>,其中每个? 是一个DynaBean 实例。

即:

public List<?> findXXX() {
    DynaClass dynaClass = new BasicDynaClass("Car", null, new DynaProperty[]{
        new DynaProperty("wheels", Long.TYPE),
        new DynaProperty("doors", Long.TYPE)}
    }
    );

    try {
        DynaBean car = dynaClass.newInstance();
        car.set("wheels", 4);
        car.set("doors", 2);
    }
    // ...

    List<DynaBean> cars = new LazyDynaList(dynaClass);
    cars.add(car);

    return cars;
}

当我发送这个List&lt;?&gt;:

public class SearchEndpoint implements ISearchEndpoint 
{

    @Inject protected SearchService searchService;

    @Override
    public Response search(String lqlSentence)
    {
        return Response.ok().entity(
            this.searchService.findXXX()
        ).build();
    }
}

在构建响应后,杰克逊将此上下文序列化为:

[
    {
        "dynaClass":{
            "dynaBeanClass":"org.apache.commons.beanutils.LazyDynaBean",
            "name":"org.apache.commons.beanutils.LazyDynaClass",
            "restricted":false,
            "returnNull":false,
            "dynaProperties":[
                {
                    "name":"wheels",
                    "type":"java.lang.Long",
                    "mapped":false,
                    "indexed":false
                },
                {
                    "name":"doors",
                    "type":"java.lang.Long",
                    "mapped":false,
                    "indexed":false
                }
            ]
        },
        "map":{
            "wheels": 4,
            "doors": 2
        }
    }
]

我只想发送:

[
    {
        "wheels": 4,
        "doors": 2
    }
]

有什么想法吗?

【问题讨论】:

    标签: java rest jakarta-ee jackson jax-rs


    【解决方案1】:

    您为什么不尝试为您的 DynaClass 创建自己的自定义 JSON 序列化程序?

    您的自定义序列化程序看起来像这样。

    import java.io.IOException;
    import java.util.List;
    
    import org.codehaus.jackson.JsonGenerator;
    import org.codehaus.jackson.JsonProcessingException;
    import org.codehaus.jackson.map.JsonSerializer;
    import org.codehaus.jackson.map.SerializerProvider;
    
    public class DynaSerializer extends JsonSerializer<DynaClass> {
    
        @Override
        public void serialize(DynaClass dyna, JsonGenerator jgen, SerializerProvider provider)
                throws IOException, JsonProcessingException {
            jgen.writeStartObject();
            jgen.writeObject(dyna.getMap());
            jgen.writeEndObject();
    
        }
    
    }
    

    然后在您的 DynaClass 中,您将告诉 Jackson 您正在使用自己的自定义序列化程序。

    @JsonSerialize(using=DynaSerializer.class)
    public class DynaClass{
    //Your class definition
    }
    

    然后获取您的 JSON 字符串 ...

    String jsonStr = new ObjectMapper().writeValueAsString(new DynaClass());
    

    对于更多解决方案,请查看此链接,它非常有帮助。 http://www.baeldung.com/jackson-custom-serialization

    【讨论】:

    • 上述解决方案只需要修改即可,如果 dynaclass 是另一个类的子类,那么您不想执行 jgen.writeStartObject() 和 jgen.writeEndObject();。你需要评论那些行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2014-08-20
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多