2016-11-30 86 views
0

有沒有一種方法可以通過註釋爲特定類添加ObjectMapper。http呼叫期間特定類的對象映射器映射

@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)我在這需要ObjectMapper的序列化功能的類的頂部添加@JsonRootName啓用對WRAP_ROOT_VALUE,如: -

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE); 
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 

這個地方可以添加僅在這個類來體現。

回答

2

也許只是保持默認的序列化行爲?然後,在反序列化過程中,您仍然會提取「僱員」包裝,但在序列化時,您可以在沒有包裝的情況下編寫它。

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); 
    } 
} 
+0

我的問題也問在哪裏把這個對象映射程序代碼,因爲如果我創建一個bean它將適用於整個項目。但我只想在這個Sample類中進行deserilisation,而不是在其他任何類中。 – sunder

+0

@sunder我更新了我的答案。那是你在找什麼? – gregbert