【问题标题】:Jackson JSON, REST Data Binding & HashMaps problemJackson JSON、REST 数据绑定和 HashMaps 问题
【发布时间】:2011-08-04 08:42:29
【问题描述】:

我使用 Spring 实现了一个 RESTful Web 服务,并使用 Jackson JSON 作为 JSON 对象的序列化器/反序列化器。

但是,当要反序列化的对象包含 HashMap 时,我遇到了错误 415:

private Map<String, String> requestMap = new HashMap<String, String>();

如果我删除它,一切都会完美运行。这是一个已知的问题?有修复吗?

谢谢, 斯里

【问题讨论】:

  • 如果 Jackson 不支持对象的序列化,您会得到 415。您能否扩展您的问题以显示包含地图的类的更完整示例?
  • @skaffman .. 这里是 gist.github.com/919959 类 .. 它也有公共的 getter 和 setter
  • 我没有在其中看到任何Map
  • 注释掉了,第 17 行。

标签: java json spring jackson


【解决方案1】:

严格来说,Jackson 从接口类型引用序列化就好了。下面证明了这一点。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.codehaus.jackson.map.ObjectMapper;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();

    Map<String, String> requestMap = new HashMap<String, String>();
    requestMap.put("one", "1");
    requestMap.put("two", "2");

    System.out.println(mapper.writeValueAsString(requestMap));
    // output: {"two":"2","one":"1"}

    List<UserPermission> userPermissions = new ArrayList<UserPermission>();
    userPermissions.add(new UserPermissionImpl("domain1"));
    userPermissions.add(new UserPermissionImpl("domain2"));

    System.out.println(mapper.writeValueAsString(userPermissions));
    // output: [{"scope":"domain1"},{"scope":"domain2"}]

    Container container = new ContainerImpl(requestMap, userPermissions);

    // From an Interface-type reference, where the implementation is an object with two Interface-type references:
    System.out.println(mapper.writeValueAsString(container));
    // {"requestMap":{"two":"2","one":"1"},"userPermissions":[{"scope":"domain1"},{"scope":"domain2"}]}
  }
}

interface UserPermission {}

class UserPermissionImpl implements UserPermission
{
  public String scope;
  UserPermissionImpl(String scope) { this.scope = scope; }
}

interface Container {}

class ContainerImpl implements Container
{
  public Map<String, String> requestMap;
  public List<UserPermission> userPermissions;

  ContainerImpl(Map<String, String> requestMap, List<UserPermission> userPermissions)
  { this.requestMap = requestMap; this.userPermissions = userPermissions; }
}

您使用的系统存在其他问题。

【讨论】:

  • 这也许是正确的。我不太确定,这个线程已经有几个月了,我已经转移了项目,所以我不能在那个代码库上测试它,但我有时间会玩。 :-)
  • Spring 和 Jersey 为 JSON 处理添加了有趣的东西。有一些事情需要特殊配置才能获得默认的 Jackson 行为。如果您确实知道发生了什么,请发布更新。我敢肯定,我不是唯一一个好奇的人。
【解决方案2】:

发现问题。 Jackson JSON 在接口方面存在困难。所以在定义中,使用 HashMaps 和 ArrayLists 而不是 Maps 和 Lists。不确定这是否是一个完美的解决方案,但它对我有用。

【讨论】:

  • “发现问题。Jackson JSON 在接口方面有困难。” ——请详细说明。杰克逊在接口上有什么困难?你发现的具体问题是什么? Jackson 项目网站上是否记录了相应的问题?
  • 不确定是否记录了该错误,或​​者它是否是一个错误。我的意思是它不会反序列化一个 List,而是反序列化为 ArrayList。
猜你喜欢
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多