Передача содержимого созданного руководства JSONObject Джексону - PullRequest
0 голосов
/ 31 марта 2020

Если я хочу получить вход в базу данных сущности, я получаю правильный результат, но у этого результата есть разрывы строк, которых я не хочу. Я хочу вот что (jsonfile):

    {
  "id" : 20706,
  "name" : "Ecole des Ponts ParisTech",
  "institution_type" : {
    "id" : 2,
    "name" : "Research facility"
  },

Но я получаю вот что:

{"institution":["{\r\n  \"id\" : 20706,\r\n  \"name\" : \"Ecole des Ponts ParisTech\",\r\n  \"institution_type\" : {\r\n    \"id\" : 2,\r\n    \"name\" : \"Research facility\"\r\n  },

Мой код для получения:

ObjectMapper objectMapper = ObjectMapperFactory.getObjectMapper();
EditorialDAO dao = EditorialManager.dao();
    String valueValue = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(dao.get(Institution.class,20706));

Да, я хочу строку, но не с переводом строки и \ для моего ".

Мой ObjectMapper объявлен следующим образом:

ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.setSerializationInclusion(Include.NON_NULL);
    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    objectMapper.disable(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS);
    objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    objectMapper.configure(SerializationFeature.EAGER_SERIALIZER_FETCH, true);
    objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);

РЕДАКТИРОВАТЬ: следующий код после получения valueValue:

String response = objectMapper.writeValueAsString(dao.get(Basic.class, 323));
                JSONObject jsonObject = new JSONObject(response);       
                jsonObject.put(institution, valueValue);
                response = jsonObject.toString();
                dao.merge(objectMapper.readValue(response, Basic.class));

Если я пытаюсь объединиться, я получаю эту ошибку:

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of Institution: no String-argument constructor/factory method to deserialize from String value();

Чего я не получаю: я просто помещаю этот входной сигнал из базы данных точно в мой JSON и мой Basi c. Класс Entity имеет тип Institution.

@Entity
@JsonInclude(Include.NON_EMPTY)
public class Basis implements{

    @Id
    @SortableField
    @SequenceGenerator(name = "basis_generator", sequenceName = "basis_id_basis_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "basis_generator")
    @Column(name="id_basis")
    @JsonView(View.Minimal.class)
    private int id;

    @ManyToOne
    @NotFound(action=NotFoundAction.IGNORE)
    @JsonView(View.Minimal.class)
    @JoinColumn(name="id_institution")
    private Institution institution;

1 Ответ

1 голос
/ 31 марта 2020

Решение этой проблемы состоит в том, чтобы не передавать valueValue непосредственно в вас jsonObject. Вместо этого он должен быть JsonObject своего собственного.

JSONObject jsonObject = new JSONObject(response);       
jsonObject.put(institution, new JSONObject(valueValue));


Непосредственное пропускание значения json приводит к следующему выводу, где кавычки экранируются, а дополнительные кавычки имеют были добавлены вокруг значения. Этот способ следует использовать только для примитивных типов.

{"institution":"{\"id\":20706,\"name\":\"Ecole des Ponts ParisTech\",\"institutionType\":{\"id\":2,\"name\":\"Research facility\"}}","id":1}


Если обернут в новый JsonObject, результатом будет правильное представление, которое jackson может обрабатывать.

{"institution":{"name":"Ecole des Ponts ParisTech","institutionType":{"name":"Research facility","id":2},"id":20706},"id":1}

Ps .: Независимо от того, была ли оригинальная строка в красивом формате печати или нет, не имеет значения.

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