http调用期间特定类的Object Mapper映射

时间:2016-11-30 18:57:56

标签: java spring http spring-mvc jackson

有没有办法可以通过注释为特定类添加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); 

可以添加此内容以仅反映此类。

1 个答案:

答案 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);
    }
}