【问题标题】:Jackson Deserialization of custom POJOJackson 自定义 POJO 的反序列化
【发布时间】:2017-04-24 08:03:45
【问题描述】:

我有一个像这样的 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&lt;String, Object&gt; 但可以仅转换为 String,因为转换为其他内容通常会导致异常。

我收到的异常如下所示:

"messageKey": "com.fasterxml.jackson.databind.JsonMappingException", "message": "无法构造 com.company.api.data.authn.LdapUser 的实例,问题:抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,要么在 [来源:{JSON}(通过引用链:java.util.ArrayList[0])", “returnType”:“致命”

对象 LdapUser 是可序列化的,所以我不明白 Jackson 对我说的问题。

【问题讨论】:

  • LdapUser 是一个接口,而不是concrete type,因为错误状态

标签: java json serialization jackson deserialization


【解决方案1】:

您将LdapUser.class 用于typeReference。

您需要在这里使用具体类型,例如LdapUserImpl.class,因为接口没有字段或方法实现,因此它无法读取您的 getter 和 setter。

【讨论】:

  • 好的,所以他不自己检索标准实现?
  • 接口没有“标准实现”。你自己写的……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 2016-02-13
  • 2011-04-12
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多