Spring десериализовать объект с полем JSONObject - PullRequest
0 голосов
/ 24 августа 2018

У меня проблемы с десериализацией объекта, содержащего поле JSON весной.У меня есть DataTable структура данных, которая имеет как строковые поля, так и поле, которое должно содержать JSONObject:

public class DataTable {

        private String identifier;  
        private String version;         
        private JSONObject content;

        //getters and setters 
}

Я хочу иметь возможность сохранить этот объект и извлечь его позже.Когда я публикую такой объект DataTable на моем контроллере и попытаюсь получить его позже, мое поле content будет пустым, независимо от того, что я опубликовал:

{
  "identifier": "id1",
  "version": "0.0.1",
  "content": {
    "empty": true
  }
}

Кажется, что Джексон неможет правильно десериализовать поле типа JSONObject и просто оставит его пустым.Как я могу заставить его десериализовать поле правильно?

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Для этого вы можете использовать специальный десериализатор:

public class Test {
  public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
    ObjectMapper mapper = new ObjectMapper();
    final SimpleModule module = new SimpleModule("configModule",   Version.unknownVersion());
    module.addDeserializer(DataTable.class, new DeSerializer());
    mapper.registerModule(module);
    // DataTable readValue = mapper.readValue(<xml source>);
  }
}

class DeSerializer extends StdDeserializer<DataTable> {

  protected DeSerializer() {
    super(DataTable.class);
  }

  @Override
  public DataTable deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
    // use p.getText() and p.nextToken to navigate through the xml and construct DataTable object
    return new DataTable();

  }
}
0 голосов
/ 24 августа 2018

Джексон имеет модуль jackson-datatype-json-org , который позволяет нам комбинировать объекты json.org с POJO или десериализовывать в объекты json.org в качестве объекта верхнего уровня.

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-json-org</artifactId>
  <version>${jackson2.version}</version>
</dependency>

Вот тест (не забудьте зарегистрировать JsonOrgModule).

public class JsonOrgJacksonTest {

    private final String json =
            "{" +
            "  \"id\": \"one\"," +
            "  \"content\": {" +
            "    \"foo\": \"bar\"," +
            "    \"baz\": \"blah\"" +
            "  }" +
            "}";

    @Test
    public void testJsonOrg() throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JsonOrgModule());

        Model model = mapper.readValue(json, Model.class);

        assertThat(model.getId()).isEqualTo("one");
        assertThat(model.getContent().get("foo")).isEqualTo("bar");
        assertThat(model.getContent().get("baz")).isEqualTo("blah");
    }

    public static class Model {
        private String id;
        private JSONObject content;

        public String getId() { return id; }
        public void setId(String id) { this.id = id; }

        public JSONObject getContent() { return content; }
        public void setContent(JSONObject content) { this.content = content; }
    }
}
0 голосов
/ 24 августа 2018

JSONObject не должен быть сериализован. Это для внутреннего использования. Если вы хотите иметь JSON-представление этой структуры данных без модели (выделенный класс), попробуйте преобразовать ее в Map.

Map<String,Object> result =
    new ObjectMapper().readValue(dataTable.getContent(), HashMap.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...