使用Jackson将关联数组请求参数转换为JSON



我收到了一个webhook POST,它看起来像这样,为了可读性,我对它进行了解码。

id=12345&event=this_event&payload[customer][name]=ABC Company&payload[customer][city]=New York&payload[service][name]=New Customer&payload[service][action]=New

使用SpringMVC,我可以很容易地将其转换为类似的Map<String, Sting>

{id=97659204, event=test, payload[customer][name]=ABC Company, payload[customer][city]=New York, payload[service][name]=New Customer, payload[service][action]=New}

我需要将每个以"payload"开头的参数(或Map键)解析为JSON对象。

解析以"payload"开头的请求参数后,我想要的输出看起来像这个

{
customer :  {
name : "ABC Company",
city : "New York"
},
service : {
name : "New Customer",
action : "New"
}
}

最后的状态是调用Jackson的ObjectMapper,将JSON转换为POJO。

由于我无法控制开始发送给我的数据格式,将这些请求参数解析为JSON对象的最佳/正确选项是什么?

谢谢。

我最终为传入的有效负载[][][]参数编写了一个自定义解析器。它使用正则表达式匹配器,然后递归来分析每个参数,遍历1…n个Map的Map,然后生成完美的Map。

@RequestMapping(value = "/receiver", method = RequestMethod.POST)
@ResponseBody
public void receiver(@RequestParam Map<String, Object> requestBody) throws IOException {
Pattern pattern = Pattern.compile("\[([^\]]+)]");
Map<String, Object> payloadMap = new HashMap<>();
Matcher matcher = null;
List<String> levels = null;
for (String key : requestBody.keySet()) {
if (key.startsWith("payload")) {
matcher = pattern.matcher(key);
levels = new ArrayList<>();
while (matcher.find()) {
levels.add(matcher.group(1));
}
payloadMap = nestMap(payloadMap, levels.iterator(), (String) requestBody.get(key));
}
}
LOG.debug(mapper.writeValueAsString(payloadMap));
}
@SuppressWarnings("unchecked")
private Map<String, Object> nestMap(Map<String, Object> baseMap, Iterator<String> levels, String value) {
String key = levels.next();
if (!levels.hasNext()) {
baseMap.put(key, value);
} else {
if (!baseMap.containsKey(key)) {
baseMap.put(key, nestMap(new HashMap<String, Object>(), levels, value));
} else {
baseMap.put(key, nestMap((Map<String, Object>) baseMap.get(key), levels, value));
}
}
return baseMap;
}

最新更新