Java或Scala,如何将\x22这样的字符转换为字符串?

介绍


最近涉及 Nginx 输出的埋点日志,实时接入 Kafka,我需要实时解析 Kafka 中埋点日志,但是在解析过程中,出现 \x22 这样的字符,使我不能将字符串解析成 JSON 对象,本着解决问题的想法进行了研究,本文作为个人笔记,可供大家参考。

问题说明


  1. 问题字符串样例
{\x22documentReferer\x22:\x22http:\x5C/\x5C/pikabu.ru\x5C/freshitems.php\x22}

上述字符串是不能直接解析成 json 字符串的,错误如下:

Exception in thread "main" com.alibaba.fastjson.JSONException: illegal identifier : \pos 1, json : {\x22documentReferer\x22:\x22http:\x5C/\x5C/pikabu.ru\x5C/freshitems.php\x22}
    at com.alibaba.fastjson.parser.JSONLexerBase.scanSymbolUnQuoted(JSONLexerBase.java:829)
    at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:286)
    at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1356)
    at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1322)
    at com.alibaba.fastjson.JSON.parse(JSON.java:152)
    at com.alibaba.fastjson.JSON.parse(JSON.java:162)
    at com.alibaba.fastjson.JSON.parse(JSON.java:131)
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:223)
    at com.test.JsonDataParseTest$.main(JsonDataParseTest.scala:19)
    at com.test.JsonDataParseTest.main(JsonDataParseTest.scala)
  1. \x22 是怎么产生的
    \x22 实际上是 Nginx 产生的,它的真实值可以是 " 或者 ',如下:
{"documentReferer":"http:\x5C/\x5C/pikabu.ru\x5C/freshitems.php"}

由于本着麻烦别人,不如麻烦自己的原则,忽略产生的原因,针对字符串本身的问题,进行解决。

解决方案


  1. 将 \x22 替换成 " 或者 '
jsonData.replaceAll("\\x22", "\"")
  1. 使用提三方 jar 如 commons-lang3
    \x 用于在 python 和其他语言中转义 ASCII 字符,在 Scala 和 Java 中,可以使用 \u`` 转义 Unicode 字符。由于 ASCII 是 Unicode 的一个子集,可以使用unescapeJava方法 (在 StringEscapeUtils 中 ),还有一些简单的更换以及添加\u``` 2个前导零一起转义字符。
    maven pom.xml 引用:
<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
            <!--<scope>provided</scope>-->
</dependency>

示例代码:

import org.apache.commons.lang3.StringEscapeUtils
StringEscapeUtils.unescapeJava(x.replaceAll("""\\x""", """\\u00"""))

原文

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 放下秋天,转向生活 是要放下的 是要转向的 不翻书了,不写诗了 唯什么美,自什么由 不可能复活了 怎么可能? 我到...
    牛怀良阅读 184评论 0 6
  • 生命总是在意了沧桑 就没有了那份该有的笑容 花儿盛开从来没有为凋落而不再美丽 生活因此不会因为负累而放下勇气 爱的...
    田萍阅读 157评论 0 3
  • 昨天我还专门的问过了一次父亲,我六爷爷是不是在我五岁的时候逝世的。当时父亲停下手中的活,想了一会儿告诉我,...
    丁聪阅读 379评论 3 3
  • 知道自己在渴望什麼吗是否有勇氣追逐心中的渴望有没有将挫折作为一次學習和成長的機會我是否愿意冒险為了爱,為了夢想,為...
    真承阅读 220评论 0 1