Невозможно преобразовать hashmap в String без использования jackson - PullRequest
0 голосов
/ 07 февраля 2019

Привет, когда я использовал приведенный ниже код, тогда он работал нормально:

Map<String, Object> commandParams = new HashMap<>();
commandParams.put("cmd", "Page.setDownloadBehavior");
Map<String, String> params = new HashMap<>();
params.put("behavior", "allow");
params.put("downloadPath", downloadPath);
commandParams.put("params", params);
HttpClient httpClient = HttpClientBuilder.create().build();

ObjectMapper objectMapper = new ObjectMapper();
String command = objectMapper.writeValueAsString(commandParams);

Теперь я хочу удалить все зависимости из моего проекта, поэтому я попытался использовать этот подход из этой ссылки но он не работает, так как пара «ключ-значение» содержит «(двойные кавычки) в нем .:

    Map<String, Object> commandParams = new HashMap<>();
    commandParams.put("cmd", "Page.setDownloadBehavior");
    Map<String, String> params = new HashMap<>();
    params.put("behavior", "allow");
    params.put("downloadPath", downloadPath);
    commandParams.put("params", params);
    HttpClient httpClient = HttpClientBuilder.create().build();

    String command ="{"+commandParams.entrySet().stream().map(e -> "\""+e.getKey() + "\"" + ":\"" + String.valueOf(e.getValue()) + "\"").collect(Collectors.joining(", "))+"}";

Поэтому я попытался сохранить команду String напрямую, как это было бы после использования класса ObjectMapper из файлов jarsиспользуя приведенный ниже код, но это также не работает:

    Map<String, Object> commandParams = new HashMap<>();
    commandParams.put("cmd", "Page.setDownloadBehavior");
    Map<String, String> params = new HashMap<>();
    params.put("behavior", "allow");
    params.put("downloadPath", downloadPath);
    commandParams.put("params", params);
    HttpClient httpClient = HttpClientBuilder.create().build();

    String command = "{\"cmd\":\"Page.setDownloadBehavior\",\"params\":{\"downloadPath\":\"C:\\\\Users\\\\I334253\\\\Downloads\\\\Test_Download\",\"behavior\":\"allow\"}}";

Вывод переменной Command после использования класса ObjectMapper был:

{"cmd":"Page.setDownloadBehavior","params":{"downloadPath":"C:\\Users\\I334253\\Downloads\\Test_Download","behavior":"allow"}}

Я попытался выполнить проект github jackson-databindно это просто слишком для меня, чтобы понять на этом уровне. Пожалуйста, дайте мне знать, как я могу достичь этого.

1 Ответ

0 голосов
/ 07 февраля 2019

Escape работает с обратной косой чертой, так же:

String command = commandParams.entrySet().stream()
    .map(e -> "\"" + escape(e.getKey()) + "\"" + ":\""
        + escape(String.valueOf(e.getValue())) + "\"")
    .collect(Collectors.joining(", ", "{", "}"));


static String escape(String s) {
    return s.replace("\\", "\\\\") // Single backslash
        .replace("\"", "\\\"");    // Double quote
}
...