【问题标题】:Converting HashMap Error Message content to JSON将 HashMap 错误消息内容转换为 JSON
【发布时间】:2020-10-22 05:09:48
【问题描述】:

所以我正在努力寻找解决这个问题的方法,我目前在前端有一个函数,它依赖于后端的错误消息。这个错误部分总结如下:

HashMap<Long, Integer> serviceListResponse = new HashMap<>();
...
if (!serviceListResponse.isEmpty()) {
                throw new IllegalArgumentException(String.valueOf(serviceListResponse));
}

所以我认为这应该可以直接解析:

$log.info(JSON.stringify(errorResponse.data.message))
log message = "{16=2140002475, 17=2140002724, 18=2140002116, 8=2140034827}"
$scope.listOfIds = JSON.parse(errorResponse.data.message);

但是它似乎没有通过 JSON.parse 并因此在该特定行结束。我之前对 ArrayLists 使用过 JSON.parse 并且没有任何问题,那么我做错了什么?谢谢。

【问题讨论】:

  • 您的问题在于String.valueOf(serviceListResponse),它返回{16=2140002475} 字符串,因为JSON = 运算符不可识别,它需要:,如key:value 中的那样解析字符串。您可以使用JacksonObjectMapper.writeValueAsString()fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/…
  • @Zedex7 有没有我可以在前端做到这一点?
  • 绝对可以,但不推荐。这是 JS Snippet 如何做到这一点 "{16=123445}".replace('=',':') -> "{16:123445}"

标签: java html json angularjs


【解决方案1】:

您的代码存在 2 个问题。首先,您没有使用ObjectMapper,它基本上负责将响应转换为Java 中的JSON。其次,由于原始字符串正在响应,因此它具有不允许您解析响应的字符。

"{16=2140002475,..}" 一样,响应已经是一个字符串,因此JSON.stringify 将不起作用,它只会在双引号""{16=2140002475, ..}"" 前加前缀和后缀。其次,即使您设法以某种方式删除引号,您的键是数字和分隔符是 = 两者都不是由 JSON.parse 标识的,它需要作为字符串的键和作为 : 的分隔符。

由于您不想更改 Java 中的代码(仍然强烈推荐),我尝试在 JS 中解析您的响应。您需要的是一个自定义解析器,它将您的响应字符串转换为 JS 字典,然后您可以直接使用它而无需 JSON.parse

function customParse(message) {
  var msgArray = message.replace(/[{}]/g, '').split(',');
  var dict = {};
  for (var data of msgArray) {
    var obj = data.split('=');
    dict[obj[0].trim()] = obj[1];
  }
  return dict;
}

var message = "{16=2140002475, 17=2140002724, 18=2140002116, 8=2140034827}";
console.log(customParse(message));

注意:如果您在原始 Java 映射中引入任何嵌套的 HashMap,这将不起作用。

【讨论】:

  • 嘿,这是否有可能更新为 Multimap 响应,或者我需要创建一个新问题?所以这个输出 {1=[2140001792, 2140001793]} 类似于 {1=2140001792, 1=2140001793}
  • HashMap&lt;Long, Integer&gt; serviceListResponse = new HashMap&lt;&gt;() 这首先不允许这样的响应。
  • 我明白,但是如果将 HashMap 更改为 MultiMap 并且 {1=[2140001792, 2140001793]} 将是响应。我们能否将格式更改为 {1=2140001792, 1=2140001793} 并保留您现有的代码?
  • 不,这行不通。可能你需要重写整个代码。
猜你喜欢
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 2014-12-02
  • 2016-12-07
  • 2013-03-18
  • 2018-06-27
  • 1970-01-01
  • 2013-10-30
相关资源
最近更新 更多