Java或Scala,如何將\x22這樣的字符轉(zhuǎn)換為字符串?

介紹


最近涉及 Nginx 輸出的埋點(diǎn)日志,實(shí)時(shí)接入 Kafka,我需要實(shí)時(shí)解析 Kafka 中埋點(diǎn)日志,但是在解析過(guò)程中,出現(xiàn) \x22 這樣的字符,使我不能將字符串解析成 JSON 對(duì)象,本著解決問(wèn)題的想法進(jìn)行了研究,本文作為個(gè)人筆記,可供大家參考。

問(wèn)題說(shuō)明


  1. 問(wèn)題字符串樣例
{\x22documentReferer\x22:\x22http:\x5C/\x5C/pikabu.ru\x5C/freshitems.php\x22}

上述字符串是不能直接解析成 json 字符串的,錯(cuò)誤如下:

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 是怎么產(chǎn)生的
    \x22 實(shí)際上是 Nginx 產(chǎn)生的,它的真實(shí)值可以是 " 或者 ',如下:
{"documentReferer":"http:\x5C/\x5C/pikabu.ru\x5C/freshitems.php"}

由于本著麻煩別人,不如麻煩自己的原則,忽略產(chǎn)生的原因,針對(duì)字符串本身的問(wèn)題,進(jìn)行解決。

解決方案


  1. 將 \x22 替換成 " 或者 '
jsonData.replaceAll("\\x22", "\"")
  1. 使用提三方 jar 如 commons-lang3
    \x 用于在 python 和其他語(yǔ)言中轉(zhuǎn)義 ASCII 字符,在 Scala 和 Java 中,可以使用 \u`` 轉(zhuǎn)義 Unicode 字符。由于 ASCII 是 Unicode 的一個(gè)子集,可以使用unescapeJava方法 (在 StringEscapeUtils 中 ),還有一些簡(jiǎn)單的更換以及添加\u``` 2個(gè)前導(dǎo)零一起轉(zhuǎn)義字符。
    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"""))

原文

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 放下秋天,轉(zhuǎn)向生活 是要放下的 是要轉(zhuǎn)向的 不翻書(shū)了,不寫(xiě)詩(shī)了 唯什么美,自什么由 不可能復(fù)活了 怎么可能? 我到...
    牛懷良閱讀 209評(píng)論 0 6
  • 生命總是在意了滄桑 就沒(méi)有了那份該有的笑容 花兒盛開(kāi)從來(lái)沒(méi)有為凋落而不再美麗 生活因此不會(huì)因?yàn)樨?fù)累而放下勇氣 愛(ài)的...
    田萍閱讀 178評(píng)論 0 3
  • 昨天我還專門(mén)的問(wèn)過(guò)了一次父親,我六爺爺是不是在我五歲的時(shí)候逝世的。當(dāng)時(shí)父親停下手中的活,想了一會(huì)兒告訴我,...
    丁聰閱讀 441評(píng)論 3 3
  • 知道自己在渴望什麼嗎是否有勇氣追逐心中的渴望有沒(méi)有將挫折作為一次學(xué)習(xí)和成長(zhǎng)的機(jī)會(huì)我是否愿意冒險(xiǎn)為了愛(ài),為了夢(mèng)想,為...
    真承閱讀 246評(píng)論 0 1

友情鏈接更多精彩內(nèi)容