Джексон JSON, REST Data Binding & HashMaps - PullRequest
1 голос
/ 13 апреля 2011

Я реализовал веб-сервис RESTful с помощью Spring и использую Jackson JSON в качестве сериализатора / десериализатора для объектов JSON.

Однако я сталкиваюсь с ошибкой 415, когда объект, который должен быть десериализован, содержит HashMap:

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

Если я удаляю это, все работает отлично.Это известная проблема?Есть какие-нибудь исправления?

Спасибо, Шри

Ответы [ 2 ]

1 голос
/ 11 июля 2011

Строго говоря, Джексон очень хорошо сериализуется из ссылок типа интерфейса.Следующее демонстрирует эту точку.

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; }
}

В системе, которую вы используете, есть другая проблема.

0 голосов
/ 20 апреля 2011

Обнаружена проблема. Джексон JSON испытывает трудности с интерфейсами. Поэтому в определениях используйте HashMaps и ArrayLists вместо Maps и Lists. Не уверен, что это идеальное решение, но оно работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...