2016-08-02 67 views
0

我有一個類定義如下:通過顛倒@XmlElement重命名的影響解組json?

public class Contact implements Serializable 
{ 
    private final static long serialVersionUID = 1L; 
    @XmlElement(name = "last-name", required = true) 
    protected String lastName; 
    @XmlElement(name = "first-name", required = true) 
    protected String firstName; 
    @XmlElement(required = true) 
    protected String id; 
    @XmlElement(name = "primary-phone") 
    protected String primaryPhone; 
    @XmlElement(name = "cellular-phone") 
    protected String cellularPhone; 
} 

該類被用於產生被傳輸通過互聯網編組JSON版本。在接收端,我試圖解組JSON,但是由於命名的不同,我遇到了困難,例如,解組庫有一個名爲primaryPhone的變量,而不是primary-phone,這是我在接收端的變量。

除了預處理接收到的JSON文本以手動替換primary-phoneprimaryPhone的實例,還有其他一些更自動化的方法來避免此問題嗎?手動轉換字符串的問題在於明天如果類定義更改,我正在編寫的代碼也需要更新。

這裏展示我目前正在做什麼,我沒有任何人工的字符串轉換的代碼片段:

String contact = "\"last-name\": \"ahmadka\""; 
ObjectMapper objMapper = new ObjectMapper(); 
Contact cObj = objMapper.readValue(contact, Contact.class); 

但與上面的代碼,我得到的最後一行例外閱讀本:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "last-name" (class Contact), not marked as ignorable (5 known properties: "lastName", "cellularPhone", "id", "primaryPhone", "firstName", ]) 
at ...........//rest of the stack 

回答

1

傑克遜默認不知道JAXB註釋(即@XmlRootElement)。它需要配置一個外部模塊才能具備此功能。在服務器上,你很可能沒有知道它。

在客戶端,如果你想配置ObjectMapper,那麼你需要添加following module

<dependency> 
    <groupId>com.fasterxml.jackson.module</groupId> 
    <artifactId>jackson-module-jaxb-annotations</artifactId> 
    <version>${jackson2.version}</version> 
</dependency> 

剛剛配置它

ObjectMapper objMapper = new ObjectMapper(); 
mapper.registerModule(new JaxbAnnotationModule()); 
+0

所以你說,如果我添加上面的依賴關係,然後調用'mapper.registerModule(new JaxbAnnotationModule());'在任何解組之前,它應該工作? – Ahmad

+0

是的。它會識別'@ XmlElement'並使用'last-name'來映射JSON而不是'lastName' –