我有一个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;
}
}
所以它基本上包含 String , Map 和 List 。
当我尝试阅读这个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 转换为 String ,那是因为我将 json 作为Map<String, Object>
但是只能转换为String,因为在大多数情况下,转换为其他东西会导致异常。
我收到的例外情况如下:
&#34; messageKey&#34;:&#34; com.fasterxml.jackson.databind.JsonMappingException&#34;, &#34; message&#34;:&#34;无法构造com.company.api.data.authn.LdapUser的实例,问题:抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,要么实例化在[来源:{JSON}(通过参考链:java.util.ArrayList [0])&#34;中添加其他类型信息\ n, &#34; returnType&#34;:&#34;致命&#34;
对象LdapUser是可序列化的,因此我不会解决杰克逊对我说的问题。
答案 0 :(得分:1)
您使用LdapUser.class
作为typeReference
。
您需要在LdapUserImpl.class
这里使用具体类型,因为接口不具有字段或方法实现,因此无法读取您的getter和setter。