2017-04-24 126 views
-1

我有一個POJO,看起來像這樣:傑克遜反序列化POJO

public class LdapUserImpl implements LdapUser 
{ 

    /** The Constant serialVersionUID. */ 
    private static final long serialVersionUID = 1L; 

    /** The action. */ 
    private String action; 

    private Map<String, String> translation; 

    /** The fields. */ 
    private List<Map<String, String>> fields; 

    public LdapUserImpl() 
    { 
    /* nothing special needed */ 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public String getAction() 
    { 
    return action; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public Map<String, String> getTranslation() 
    { 
    return translation; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public List<Map<String, String>> getFields() 
    { 
    return fields; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public void setAction(String action) 
    { 
    this.action = action; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public void setTranslation(Map<String, String> translation) 
    { 
    this.translation = translation; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public void setFields(List<Map<String, String>> data) 
    { 
    this.fields = data; 
    } 

} 

因此,它基本上包含了字符串,一個地圖列表

,當我嘗試讀取這個JSON:

[ 
{ 
    'action': 'New User', 
    'translation': 
    { 
    'key': 'ldap.action.new', 
    'value': 'ldap.action.new' 
    }, 
    'fields': 
    [ 
    { 
    'emailAddress': 'email', 
    'changed': 'false' 
    }, 
    { 
    'enabled': 'TRUE', 
    'changed': 'false' 
    }, 
    { 
    'firstName': 'First', 
    'changed': 'false' 
    }, 
    { 
    'lastName': 'Last', 
    'changed': 'false' 
    }, 
    { 
    'name': 'FirstL', 
    'changed': 'false' 
    } 
    ] 
}, 
{ 
    'action': 'New User', 
    'translation': 
    { 
    'key': 'ldap.action.new', 
    'value': 'ldap.action.new' 
    }, 
    'fields': 
    [ 
    { 
    'emailAddress': 'email2', 
    'changed': 'false' 
    }, 
    { 
    'enabled': 'TRUE', 
    'changed': 'false' 
    }, 
    { 
    'firstName': 'First2', 
    'changed': 'false' 
    }, 
    { 
    'lastName': 'Last2', 
    'changed': 'false' 
    }, 
    { 
    'name': 'FirstL2', 
    'changed': 'false' 
    } 
    ] 
} 
] 

本辦法:

CollectionType typeReference = TypeFactory.defaultInstance().constructCollectionType(List.class, LdapUser.class); 
List<LdapUser> ldapUser = objectMapper.readValue((String) data.get(RESULT_DATA), typeReference); 

如果你想知道爲什麼我投data.get字符串那是因爲我得到JSON作爲Map<String, Object>但只能轉換爲字符串,因爲鑄造別的東西導致異常大部分的時間。

我收到這樣看起來異常:

「messageKey」: 「com.fasterxml.jackson.databind.JsonMappingException」, 「消息」:「無法構建com.company.api實例.data.authn.LdapUser,提出問題:抽象類型要麼需要被映射到具體的類型,具有自定義串並轉換器,或在[來源與另外類型的信息\ n被實例:{JSON}(通過參考鏈:java.util.ArrayList中[0])「, 」returnType「:」致命「

對象LdapUser i可序列化,所以我沒有得到傑克遜對我說的問題。

+0

'LdapUser'是一個接口,而不是一個'具體type',因爲錯誤狀態 –

回答

1

您的typeReference使用。

這裏需要用一個具體類型一樣LdapUserImpl.class,因爲接口沒有字段或方法的實現,所以它不能讀取你的getter和setter方法。

+0

好了,所以他本身並不檢索標準執行? – Nico

+0

沒有「標準實行」一個接口。你自己寫的... –