Джексон: преобразование JSON, который содержит класс объекта, в карту - PullRequest
5 голосов
/ 06 декабря 2011

Класс объекта:

class User{
    public String name;
    public String password;
}

JSON:

{ sc:"200", msg:"something", userInfo:{name:"n", password:"p"} }

Я хочу получить такие результаты:

Map->contains 3 key-value
"sc"="200"
"msg"="something"
"userInfo"=User(Object Class)

Как я могу это сделать? Или как заставить его использовать другой пакет инструментов JAR?

Ответы [ 2 ]

8 голосов
/ 06 декабря 2011

Вы должны выбрать, хотите ли вы «нетипизированный» (Карты, Списки, обертки), которые достаточно легко получить:

Map<String,Object> map = new ObjectMapper().readValue(json, Map.class);

или POJO. Дело в том, что mapper действительно не может знать, что вы хотите, чтобы «userInfo» отображал определенный объект, а другие значения - что-то еще.

Но я бы предпочел просто создать другой класс, например:

public class Request {
   public int sc;
   public String message;
   public User userInfo;
   // and/or getters, setters, if you prefer
}

и привязать к этому:

Request req = new ObjectMapper().readValue(json, Request.class);

Зачем связываться с неудобными Картами, когда вы можете иметь настоящие POJO, верно? :)

3 голосов
/ 10 декабря 2011

Как небольшая модификация ответа StaxMan, если как-то желательно иметь на карте все, что не является объектом User, Джексон предоставляет @ JsonAnySetter и @ JsonAnyGetter аннотации, чтобы сделать работу.Следующий пример демонстрирует, как это можно использовать.

import java.util.HashMap;
import java.util.Map;

import org.codehaus.jackson.annotate.JsonAnySetter;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.ObjectMapper;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    // {"sc":"200","msg":"something","userInfo":{"name":"n","password":"p"}}
    String jsonInput = "{\"sc\":\"200\",\"msg\":\"something\",\"userInfo\":{\"name\":\"n\",\"password\":\"p\"}}";

    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY);

    Result result = mapper.readValue(jsonInput, Result.class);
    System.out.println(result);
    // output: 
    // Result: userInfo=User: name=n, password=p, otherThings={sc=200, msg=something}
  }
}

class Result
{
  Map otherThings = new HashMap();
  User userInfo;

  @JsonAnySetter
  void addThing(String key, Object value)
  {
    otherThings.put(key, value);
  }

  @Override
  public String toString()
  {
    return String.format("Result: userInfo=%s, otherThings=%s", userInfo, otherThings);
  }
}

class User
{
  String name;
  String password;

  @Override
  public String toString()
  {
    return String.format("User: name=%s, password=%s", name, password);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...