目录标题
- 背景
- 临时方案
- 最好的方案
背景
下游传过来的数据是一个json字符串,这个json字符串里面有的字段又套着json字符串!还有一些字段直接是null传过来的!现在要去掉null,且将一些json字符串!尽可能的换成json对象!
如下,content(json字符串)套着content(json字符串)
{
"id": null,
"type": null,
"content": "{\"marketCardId\":null,\"name\":\"最后创建一下\",\"type\":null,\"guideWords\":null,\"cardTitle\":\"文本+链接试一下12\",\"rightsExplain\":[\"测试2\"],\"smsVerificationType\":0,\"contactInfo\":null,\"productInfo\":null,\"jumpUrlInfo\":\"https://weibo.com/at/weibo\",\"acqLinkId\":null,\"acqLinkName\":null,\"acqLinkGroupId\":null,\"acqLinkGroupName\":null,\"content\":\"{\\\"marketCardId\\\":null,\\\"name\\\":\\\"最后创建一下\\\",\\\"type\\\":null,\\\"guideWords\\\":null,\\\"cardTitle\\\":\\\"文本+链接试一下12\\\",\\\"rightsExplain\\\":[\\\"测试2\\\"],\\\"smsVerificationType\\\":0,\\\"contactInfo\\\":null,\\\"productInfo\\\":null,\\\"jumpUrlInfo\\\":\\\"https://weibo.com/at/weibo\\\",\\\"acqLinkId\\\":null,\\\"acqLinkName\\\":null,\\\"acqLinkGroupId\\\":null,\\\"acqLinkGroupName\\\":null,\\\"acqLinkType\\\":null,\\\"createTime\\\":null,\\\"cardSourceFrom\\\":0,\\\"headUrl\\\":null}\",\"createTime\":null,\"cardSourceFrom\":0,\"headUrl\":null}",
"configAuditStatusEnum": null
}
临时方案
- 使用com.alibaba.fastjson.JSONObject
- 使用深度遍历
@Test
public void buildMvelScriptBusinessPrivateMsgAudit() {
String content = "{\"id\":null,\"merchantId\":null,\"type\":null,\"content\":\"{\\\"marketCardId\\\":null,\\\"name\\\":\\\"最后创建一下\\\",\\\"type\\\":null,\\\"guideWords\\\":null,\\\"cardTitle\\\":\\\"文本+链接试一下12\\\",\\\"rightsExplain\\\":[\\\"测试2\\\"],\\\"smsVerificationType\\\":0,\\\"contactInfo\\\":null,\\\"productInfo\\\":null,\\\"jumpUrlInfo\\\":\\\"https://weibo.com/at/weibo\\\",\\\"acqLinkId\\\":null,\\\"acqLinkName\\\":null,\\\"acqLinkGroupId\\\":null,\\\"acqLinkGroupName\\\":null,\\\"content\\\":\\\"{\\\\\\\"marketCardId\\\\\\\":null,\\\\\\\"name\\\\\\\":\\\\\\\"最后创建一下\\\\\\\",\\\\\\\"type\\\\\\\":null,\\\\\\\"guideWords\\\\\\\":null,\\\\\\\"cardTitle\\\\\\\":\\\\\\\"文本+链接试一下12\\\\\\\",\\\\\\\"rightsExplain\\\\\\\":[\\\\\\\"测试2\\\\\\\"],\\\\\\\"smsVerificationType\\\\\\\":0,\\\\\\\"contactInfo\\\\\\\":null,\\\\\\\"productInfo\\\\\\\":null,\\\\\\\"jumpUrlInfo\\\\\\\":\\\\\\\"https://weibo.com/at/weibo\\\\\\\",\\\\\\\"acqLinkId\\\\\\\":null,\\\\\\\"acqLinkName\\\\\\\":null,\\\\\\\"acqLinkGroupId\\\\\\\":null,\\\\\\\"acqLinkGroupName\\\\\\\":null,\\\\\\\"acqLinkType\\\\\\\":null,\\\\\\\"createTime\\\\\\\":null,\\\\\\\"cardSourceFrom\\\\\\\":0,\\\\\\\"headUrl\\\\\\\":null}\\\",\\\"createTime\\\":null,\\\"cardSourceFrom\\\":0,\\\"headUrl\\\":null}\",\"extendUnitList\":[{\"id\":null,\"merchantId\":null,\"type\":null,\"content\":\"{\\\"id\\\":null,\\\"switchStatus\\\":null,\\\"type\\\":null,\\\"questionTitle\\\":null,\\\"content\\\":\\\"\\\"}\",\"isDel\":null,\"createTime\":null,\"updateTime\":null}],\"auditSeqId\":null,\"configAuditStatusEnum\":null}";
Set<String> jsonKeys = new HashSet<>(Arrays.asList("content"));
Map<String, Object> jsonMap = transformJson(content, jsonKeys);
System.out.println("jsonMap=" + JSONObject.toJSONString(jsonMap));
}
/***
* 1.将JSON字符串里面的某个字段null剔除
* 2.将JSON字符串里面的某个字段的json字符串格式转成json对象
* @param content
* @return
*/
private Map<String, Object> transformJson(String content, Set<String> jsonKeys) {
Map<String, Object> contentMapNew = new HashMap<>();
if (JSONObject.isValid(content)) {
Map<String, Object> contentMap = JSONObject.parseObject(content, HashMap.class);
contentMap = contentMap.entrySet().stream()
.filter(entry -> Objects.nonNull(entry.getValue()))
.filter(entry -> !Objects.equals("null", entry.getValue()))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue,
HashMap::new));
for (Entry<String, Object> entry : contentMap.entrySet()) {
if (jsonKeys.contains(entry.getKey())
&& entry.getValue() instanceof String
&& JSONObject.isValid((String) entry.getValue())) {
contentMapNew.put(entry.getKey(), transformJson((String) entry.getValue(), jsonKeys));
} else {
contentMapNew.put(entry.getKey(), entry.getValue());
}
}
}
return contentMapNew;
}
感兴趣的同学还可以扩展!这里只是一个简单思路!
最好的方案
让上游给传正确的格式!!!