Spring - возврат необработанного JSON без двойной сериализации - PullRequest
0 голосов
/ 04 октября 2018

Я знаю, что есть другие подобные сообщения, но я не нашел ни одного, который помог бы мне найти решение для этого конкретного случая.

Я пытаюсь вернуть HashMap<String, Object> с моего контроллера.Часть Object является строкой JSON, но она дважды сериализуется и не возвращается в виде необработанной строки JSON, поэтому не заканчивается дополнительными кавычками и escape-символами.

Функция контроллера:

@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public HashMap<String, Object> heartbeat(){
    String streamInfo = service.getStreamInfo();
    String streamCursorInfo = service.getStreamCursorInfo();
    String topicInfo = service.getTopicInfo();

    String greeting = "This is a sample app for using Spring Boot with MapR Streams.";

    HashMap<String, Object> results = new HashMap();
    results.put("greeting", greeting);
    results.put("streamInfo", streamInfo);
    results.put("streamCursorInfo", streamCursorInfo);
    results.put("topicInfo", topicInfo);

    return results;
}

Сервисная функция:

private String performCURL(String[] command){
    StringBuilder stringBuilder = new StringBuilder();

    try{
        ProcessBuilder processBuilder = new ProcessBuilder(command);
        Process p = processBuilder.start();

        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = null;
        while((line = reader.readLine()) != null){
            stringBuilder.append(line);
        }
    }
    catch(Exception e){
        LOGGER.error(ExceptionUtils.getRootCauseMessage(e));
    }

    return stringBuilder.toString();
}

Я запускаю команду cURL, которая возвращает необработанную строку JSON.Так что я просто пытаюсь добавить его в HashMap, чтобы он возвращался в ответе сердцебиения.

Но каждый раз, когда я запускаю это, мой вывод выглядит так:

{
"greeting": "This is a sample app for using Spring Boot with MapR Streams.",
"streamCursorInfo": "{\"timestamp\":1538676344564,\"timeofday\":\"2018-10-04 02:05:44.564 GMT-0400 PM\",\"status\":\"OK\",\"total\":1,\"data\":[{\"consumergroup\":\"MapRDBConsumerGroup\",\"topic\":\"weightTags\",\"partitionid\":\"0\",\"produceroffset\":\"44707\",\"committedoffset\":\"10001\",\"producertimestamp\":\"2018-10-03T05:57:27.128-0400 PM\",\"consumertimestamp\":\"2018-09-21T12:35:51.654-0400 PM\",\"consumerlagmillis\":\"1056095474\"}]}",
...
}

Если я возвращаю только одну строку, такую ​​как streamInfo, тогда она работает нормально и не добавляет лишних кавычеки избежать символов.

Может кто-нибудь объяснить, что мне не хватает или что нужно сделать, чтобы предотвратить эту двойную сериализацию?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Вместо возврата HashMap создайте объект, подобный этому:

public class HeartbeatResult {
  private String greeting;
  ... //other fields here

  @JsonRawValue
  private String streamCursorInfo;

  ... //getters and setters here (or make the object immutable by having just a constructor and getters)
}

С @JsonRawValue Джексон будет сериализовать строку как есть.См. https://www.baeldung.com/jackson-annotations для получения дополнительной информации.

0 голосов
/ 04 октября 2018

streamCursorInfo - это строка, а не объект => при сериализации будет экранирован символ ".

Если вы сможете вернуть объект, содержащий данные, он будет работать" из коробки ".есть только строка, я предлагаю сериализовать ее в JsonNode и добавить в ответ

ObjectMapper objectMapper = new ObjectMapper();

JsonNode streamCursorInfo = objectMapper.readTree(service.getStreamInfo())

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