如何将JSON字符串里面的某些的json字符串格式转成json对象?

目录标题

  • 背景
  • 临时方案
  • 最好的方案

背景

下游传过来的数据是一个json字符串,这个json字符串里面有的字段又套着json字符串!还有一些字段直接是null传过来的!现在要去掉null,且将一些json字符串!尽可能的换成json对象!

如何将JSON字符串里面的某些的json字符串格式转成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","extendUnitList"));
        Map<String, Object> jsonMap = transformJson(content, jsonKeys);
        System.out.println("jsonMap=" + JSONObject.toJSONString(jsonMap));
    }

	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 if (jsonKeys.contains(entry.getKey())
                        && entry.getValue() instanceof List
                        && ((List) entry.getValue()).size() > 0) {
                    List ls = new ArrayList<>();
                    for (Object o : ((List) entry.getValue())) {
                        if (o instanceof String) {
                            ls.add(transformJson((String) o, jsonKeys));
                        } else if (o instanceof Map) {
                            ls.add(transformJson(JSONObject.toJSONString(o), jsonKeys));
                        }
                    }
                    contentMapNew.put(entry.getKey(), ls);
                } else {
                    contentMapNew.put(entry.getKey(), entry.getValue());
                }
            }
        }
        return contentMapNew;
    }

感兴趣的同学还可以扩展!这里只是一个简单思路!

最好的方案

让上游给传正确的格式!!!

如何将JSON字符串里面的某些的json字符串格式转成json对象?_第1张图片

你可能感兴趣的:(Java基础,json,python,数据库,json字符串转换)