You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

日志优化:如何识别并移除字符串中的JSON/XML Payload

移除日志字符串中的JSON/XML Payload

需求概述

需要优化生产环境日志,移除字符串中包含的JSON或XML类型的Payload内容,将其替换为空结构(如JSON保留{},XML保留空标签<tag></tag>)。示例输入如下:

String jsonString= "This is jsonstring:{\"name\":\"xyz\",\"address\":\"pqr\"}";
String xmlString= "This is xmlString not able to convert in code format of XML content:\n<customer>John Smith</customer>";

实现思路

  1. JSON处理:基于Jackson库定位JSON起始位置,解析后清空所有节点内容,再将空JSON结构替换回原字符串。
  2. XML处理:通过正则匹配XML标签对,清空标签内的文本内容,保留标签结构。
  3. 统一逻辑:先判断字符串中是否存在JSON或XML特征,分别触发对应处理逻辑;若同时存在则依次处理。

完整代码实现

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class LogPayloadCleaner {
    private static final ObjectMapper objectMapper = new ObjectMapper();
    // 匹配XML标签对的正则(支持简单嵌套,可根据实际场景调整)
    private static final Pattern XML_TAG_PATTERN = Pattern.compile("<([a-zA-Z0-9_-]+)>(.*?)</\\1>", Pattern.DOTALL);

    public static String cleanLogPayload(String logStr) {
        // 先处理JSON Payload
        String cleanedStr = cleanJsonPayload(logStr);
        // 再处理XML Payload
        cleanedStr = cleanXmlPayload(cleanedStr);
        return cleanedStr;
    }

    private static String cleanJsonPayload(String str) {
        int startIdx = str.indexOf("{");
        if (startIdx == -1) {
            return str;
        }
        // 找匹配的},避免嵌套JSON的错误处理
        int endIdx = findMatchingBracket(str, startIdx);
        if (endIdx == -1) {
            return str;
        }
        try {
            JsonNode jsonNode = objectMapper.readTree(str.substring(startIdx, endIdx + 1));
            if (jsonNode instanceof ObjectNode) {
                ((ObjectNode) jsonNode).removeAll();
                // 将空JSON替换回原位置
                return str.substring(0, startIdx) + jsonNode.toString() + str.substring(endIdx + 1);
            }
        } catch (Exception e) {
            // 解析失败则不处理,保留原内容
            return str;
        }
        return str;
    }

    private static int findMatchingBracket(String str, int startIdx) {
        int count = 1;
        for (int i = startIdx + 1; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c == '{') {
                count++;
            } else if (c == '}') {
                count--;
                if (count == 0) {
                    return i;
                }
            }
        }
        return -1;
    }

    private static String cleanXmlPayload(String str) {
        Matcher matcher = XML_TAG_PATTERN.matcher(str);
        StringBuilder sb = new StringBuilder();
        while (matcher.find()) {
            // 替换标签内的内容为空
            matcher.appendReplacement(sb, "<$1></$1>");
        }
        matcher.appendTail(sb);
        return sb.toString();
    }

    // 测试示例
    public static void main(String[] args) {
        String jsonString= "This is jsonstring:{\"name\":\"xyz\",\"address\":\"pqr\"}";
        String xmlString= "This is xmlString not able to convert in code format of XML content:\n<customer>John Smith</customer>";
        String mixedString = "Mix content: {\"id\":1,\"data\":\"<user>Alice</user>\"}";

        System.out.println(cleanLogPayload(jsonString));
        // 输出:This is jsonstring:{}
        System.out.println(cleanLogPayload(xmlString));
        // 输出:This is xmlString not able to convert in code format of XML content:
        // <customer></customer>
        System.out.println(cleanLogPayload(mixedString));
        // 输出:Mix content: {}
    }
}

关键说明

  • JSON处理:通过匹配成对的{}避免嵌套JSON的错误处理,解析失败时直接返回原字符串,保证日志完整性。
  • XML处理:使用正则匹配简单XML标签对,若需要处理复杂嵌套XML,建议使用DOM/SAX解析库(如JDOM2、DOM4J)来实现更可靠的内容清空。
  • 扩展性:可根据实际日志格式调整正则或解析逻辑,比如处理数组类型的JSON([]),只需扩展findMatchingBracket方法匹配[]即可。

内容的提问来源于stack exchange,提问作者Amit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 00:42:30