Android去除 json 中轉義反斜槓


Android去除 json 中轉義反斜槓

遇到的問題

在 App 中添加一個活動頁,這個活動頁是用 H5 來展示的。

H5的鏈接是定義成固定的,即再進入時便有H5的鏈接;

H5 右上角有一個分享按鈕,點擊分享按鈕,分享一個新的鏈接地址到微信,或者微信朋友圈。

現在問題來了,分享的數據從哪拿呢?

可能朋友們覺得這很簡單啊 ,直接在創建 View 的時候拿唄!

其實單獨來這麼做肯定沒什麼問題,但是我們的這個 H5 的頁面承載了很多功能,有很多邏輯,所以如果這樣拿數據的話,又要新加判斷邏輯,因為其他跳轉過來的 H5 是不需要這樣的邏輯的。

於是我們集體碰了下頭,商量出來這樣的一個想法:

既然 我們的這個 H5 頁面的鏈接是固定的,那麼為了減少請求網絡以及避免給原有的 H5 頁面造成影響的情況下呢,我們可以把 分享要用到的數據放到網頁連麥,這樣再加載網頁時,其實在網頁中已經有數據了。

然後 Android 本地再通過 調用 js 往外暴露的方法,去拿到分享數據,這樣不就兩全其美了嗎!

於是說幹就幹:

第一步、等後端給寫好的 H5 地址

第二步、加載這個 H5 地址

第三步、給分享按鈕添加判斷邏輯,只有當前這種情況下,才出發 調取這個 js 方法

然後給這個分享按鈕添加點擊事件,點擊事件我們是這樣定義的。

<code> share_fl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
progress_webview.evaluateJavascript("javascript:app_share_ret()", new ValueCallback<string>() {
@Override
public void onReceiveValue(String value) {
if (TextUtils.isEmpty(value)) {
return;
}
String newValue = StringEscapeUtils.unescapeJava(value.substring(1, value.length() - 1));
ShareBean shareBean = AppClient.getInstance().getGson().fromJson(newValue, ShareBean.class);
}
});
}
});
/<string>/<code>

即,使用 evaluateJavascript 方法去調用 js ,因為這樣能拿到 js 方法返回的值,如果只是單純的去調用方法,那麼可以用

<code>webview.loadUrl("javascript:js方法名()") 

/<code>

第四步、問題來了

返回的數據仍存在轉移字符

但是,我不是立馬發現的,指導我把網頁中定義好的字符串拷貝過來,然後和返回的字符串一起打印,我才發現:

拷貝過來的字符串 和 返回的字符串對比,拷貝的沒有轉義字符,而返回的有。

也就是返回的字符串是這樣的

<code>{\"share_title\": \"分享標題\",
\"share_desc\": \"分享描述\",
\"share_link\": \"https://www.baidu.com\",
\"share_image\": \"https://www.baidu.com/baidu.png\"}
/<code>

但是複製過來後,打印出來的是這樣的

<code>{"share_title": "分享標題",
"share_desc": "分享描述",
"share_link": "https://www.baidu.com",
"share_image": "https://www.baidu.com/baidu.png"}
/<code>

但是,奇怪的是 iOS 能夠解析並且分享成功,但是 Andorid 確不行。

第五步、解決方案

剛開始的時候,簡單實用將轉義符號替換掉,成功了,但是問題是有可能內容中存在\\的符號。

所以換的第二種

先依賴 apache 的一個文件

<code> implementation "org.apache.commons:commons-lang3:3.8.1"
/<code>

然後使用

<code> String newValue = StringEscapeUtils.unescapeJava(value);
/<code>

去掉了\\

終於搞定!

小夥伴們有沒有更好的方法,可以留言溝通一下哈~


分享到:


相關文章: