【问题标题】:Not able to convert hashmap to String without using jackson不使用杰克逊就无法将哈希图转换为字符串
【发布时间】:2019-02-07 15:51:12
【问题描述】:

嗨,当我使用以下代码时,它工作正常:

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);

现在我想从我的项目中删除所有依赖项,所以我尝试使用 this link 中的这种方法,但它不起作用,因为键和值对中包含“(双引号)。:

    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(", "))+"}";

所以我尝试直接保存字符串命令,就像在使用下面的代码从杰克逊罐子中使用 ObjectMapper 类之后一样,但这也不起作用:

    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\"}}";

使用 ObjectMapper 类后 Command 变量的输出为:

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

我尝试浏览 jackson-databind github 项目,但在这个级别上我无法理解它。请告诉我如何实现这一目标。

【问题讨论】:

  • 太难理解了,因为写一个json解析器的工作量很大。那么为什么要实现自己的呢?
  • 我个人更喜欢编写 POJO 类并在重写的 toString() 方法中做这些事情
  • @Deadpool 任何你可以参考我的网站或博客,这样我就可以理解这些东西并为我自己实现一个。因为我不太熟悉。

标签: java json hashmap jackson jackson-databind


【解决方案1】:

转义与反斜杠一起使用,所以这样做:

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
}

【讨论】:

    猜你喜欢
    • 2017-12-03
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    相关资源
    最近更新 更多