有没有办法可以通过注释为特定类添加ObjectMapper。
@JsonRootName("employee")
public class Sample implements Serializable{
private String name;
private String id;
// Getters and setters
}
在RestController中,我有RequestMapping和类似的方法: -
@ResponseBody
public Sample (@RequestBody Sample sample){
//some logic
return sample;
}
我的输入有效负载就像
{
"employee":{
"name":"abcd",
"id":"1234"
}
}
我想要的输出是
{
"name":"abcd",
"id":"1234"
}
1)有没有办法可以使用同一个类来完成输入和输出。
2)我在类的顶部添加了@JsonRootName,它需要ObjectMapper的序列化功能启用WRAP_ROOT_VALUE,如: -
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
可以添加此内容以仅反映此类。
答案 0 :(得分:2)
也许只是保留默认的序列化行为?然后,在反序列化时你仍然会拔出“employee”包装器,但在序列化时你会在没有包装器的情况下编写它。
ObjectMapper mapper = new ObjectMapper();
//mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
通过输入,我得到了所需的序列化输出:
{"name":"abcd","id":"1234"}
修改强>
至于放置此代码的位置,我建议使用具有处理(de)序列化的静态方法的单例或类。您可以使用两个不同的映射器,而不是执行“正常”或“包装”行为。以下是静态方法方法的概述:
public class SerializationUtil {
private static ObjectMapper normalObjectMapper;
private static ObjectMapper wrappedObjectMapper;
static {
/* configure different (de)serialization strategies */
normalObjectMapper = new ObjectMapper();
wrappedObjectMapper = new ObjectMapper();
wrappedObjectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
wrappedObjectMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
}
public static <T> T normalDeserialize(String json, Class<T> clazz) throws Exception {
return normalObjectMapper.readValue(json, clazz);
}
public static String normalSerialize(Object bean) throws Exception {
return normalObjectMapper.writeValueAsString(bean);
}
public static <T> T deserializeWrappedObject(String json, Class<T> clazz) throws Exception {
return wrappedObjectMapper.readValue(json, clazz);
}
public static String serializeWrappedObject(Object bean) throws Exception {
return wrappedObjectMapper.writeValueAsString(bean);
}
}
此方法的好处是它允许调用者决定序列化行为。因此,如果您需要以不同方式处理代码的某些部分,则可以调用另一种方法。请注意,包装/解包都已启用。因此,要获得所需的行为,您可以这样称呼这些方法:
public static void main(String[] args) {
Bean bean = SerializationUtil.deserializeWrappedObject(jsonInput, Bean.class);
String jsonOutput = SerializationUtil.normalSerialize(bean);
}
如果这对您没有吸引力,您可以选择检测特殊情况并在同一方法调用中处理它:
public static <T> T deserialize(String json, Class<T> clazz) throws Exception {
if (clazz instanceof Bean) {
return wrappedObjectMapper.readValue(json, clazz);
} else {
return normalObjectMapper.readValue(json, clazz);
}
}