Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

怎么去掉报文中的转义符(杂记) #147

Open
soapgu opened this issue May 28, 2022 · 0 comments
Open

怎么去掉报文中的转义符(杂记) #147

soapgu opened this issue May 28, 2022 · 0 comments
Labels
JAVA This doesn't seem right 安卓 安卓

Comments

@soapgu
Copy link
Owner

soapgu commented May 28, 2022

  • 前言

主要还是处理现实项目中的问题,最近碰到一点点小问题。
调试过来的报文还要分两批解析,把内容单独转义下丢data字段。
比如下面

{"success":1,"data":"{\"acSessionId\":\"\",\"szTermType\":\"HUAWEI IdeaHub Pro\"}"}

我们知道嵌入了转义符号,直接转json肯定不行。

  • “毛版”去转义

现场就是要快,解决问题是第一位,所以有了如下版本

    static final CharSequence old = "\\";
    static final CharSequence target = "";

    public <T> T parseData(Class<T> classOfData){
        String dataJson = data.replace( old,target );
        Logger.i( "dataJson:%s",dataJson );
        return gson.fromJson( dataJson,classOfData );
    }

代码比较粗暴,但是解决问题了,能解决问题的代码就是好代码

  • “文艺版”去转义

毛版是能解决问题,问题就是太糙了。万一我内容里面真的有\的文字怎么办,不是一起被“干掉”了。
翻了下网上的解决方案
安卓就是这个好属于JAVA子集,很多JAVA包可以直接拿来用,有时觉得JAVA已经很完善了,折腾什么Kotlin,谷歌这样搞明显过河拆桥太不仗义。

// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
implementation 'org.apache.commons:commons-lang3:3.12.0'

推荐这个包使用这个类

结果一看
as of 3.6, use commons-text StringEscapeUtils instead

implementation 'org.apache.commons:commons-text:1.9'
换另外一个包

 public <T> T parseData(Class<T> classOfData){
        //String dataJson = simpleTranslate(data);
        String dataJson = StringEscapeUtils.unescapeJava(data);
        Logger.i( "dataJson:%s",dataJson );
        return gson.fromJson( dataJson,classOfData );
    }

    private String simpleTranslate( String orgString ){
        return data.replace( old,target );
    }

好吧simpleTranslate可以扫进垃圾堆里面去了。

  • 看一看内部实现

public static final CharSequenceTranslator ESCAPE_JAVA;
    static {
        final Map<CharSequence, CharSequence> escapeJavaMap = new HashMap<>();
        escapeJavaMap.put("\"", "\\\"");
        escapeJavaMap.put("\\", "\\\\");
        ESCAPE_JAVA = new AggregateTranslator(
                new LookupTranslator(Collections.unmodifiableMap(escapeJavaMap)),
                new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE),
                JavaUnicodeEscaper.outsideOf(32, 0x7f)
        );
    }

Translator会逐字解析。具体算法就不细看了

@soapgu soapgu added 安卓 安卓 JAVA This doesn't seem right labels May 28, 2022
soapgu added a commit that referenced this issue May 30, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
JAVA This doesn't seem right 安卓 安卓
Projects
None yet
Development

No branches or pull requests

1 participant