从 JSON 到 Android 的右单引号

Posted

技术标签:

【中文标题】从 JSON 到 Android 的右单引号【英文标题】:Right Single Quotation Mark from JSON to Android 【发布时间】:2020-10-02 21:16:03 【问题描述】:

我正在尝试将一些数据从数据库发送到我的 android 应用程序。我创建了一个 JSON php 页面,它从我的数据库中获取和格式化信息,并通过 json_encode() 在我的 Android 应用程序中检索我的数据。

但是,我在这里遇到了一个问题。我的数据库中的某些文本有一些右单引号 (RSQM)。对于常规报价,一切正常。但是对于 RSQM,当我显示 php 页面时,一切都很好,像这样:

"ID":"9039","Title":"La Bamba / Twist'n Shout","Artist":"Ritchie Valens / Isley Brothers","难度":" 4","日期":"9/21/2018"

但是,当我在我的 Android 应用上使用 Json 检索它时,这就是我所拥有的:

"ID":"9039","Title":"La Bamba / Twist’ ;n Shout","Artist":"Ritchie Valens / Isley Brothers","难度" :"4","日期":"9/21/2018"

(我必须在代码和分号之间添加一个空格,否则它会被解释并显示为单引号)。

如您所见,在 php 页面中,斜杠是转义符,而不是 RSQM。

我尝试使用 str_replace 手动转义它,但似乎找不到该字符,因为它没有替换任何内容。

我尝试通过将 .disablehtmlEscaping() 添加到我的 GsonBuilder 来在应用程序端处理它,但没有。

代码如下:

val networkModule = module 

single 

    val customGson =
        GsonBuilder().registerTypeAdapter(Lesson::class.java, LessonDeserializer())
            .disableHtmlEscaping()
            .create()

    Retrofit.Builder()
        .client(get())
        .addConverterFactory(
            GsonConverterFactory.create(customGson)
        )
        .baseUrl(BuildConfig.URL)
        .build()



factory 

    val httpLoggingInterceptor = HttpLoggingInterceptor()
    httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
    OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor).build()


factory 
    get<Retrofit>().create(LessonApi::class.java)



和LessonDeserializer:

class LessonDeserializer : JsonDeserializer<Lesson> 

private val simpleDateFormat: SimpleDateFormat = SimpleDateFormat("dd / MM / yy")

override fun deserialize(
    json: JsonElement?,
    typeOfT: Type?,
    context: JsonDeserializationContext?
): Lesson 
    val lesson = Gson().fromJson(json, Lesson::class.java)
    return lesson

我调试了一下,好像在反序列化器的'json'变量中,文本已经被转义了,所以我不知道这种情况发生在何时何地,以及如何避免。

我应该按原样获取字符串,然后在 Java 中取消转义它吗?我应该先修改我的 php 文件以逃避 RSQM 吗?

谢谢。

编辑: 以下是单引号运行良好的示例: 在php网页上:

"ID":"11850","Title":"柠檬树","艺术家":"愚人节花园","难度":"4","日期":" 2020 年 4 月 2 日"

Android 应用上的 Json 字符串:

"ID":"11850","Title":"柠檬树","艺术家":"愚人节花园","难度":"4","日期":" 2020 年 4 月 2 日"

编辑 2:只是为了完成 this.mitch 所说的内容,这就是我所做的,不推荐使用:

我在 build.gradle 中添加了依赖:

implementation 'androidx.core:core:1.3.0'

然后我导入了:

import androidx.core.text.HtmlCompat

还有:

lesson.title = HtmlCompat.fromHtml(lesson.title, HtmlCompat.FROM_HTML_MODE_LEGACY).toString()

【问题讨论】:

字符串中可能有一些时髦的字符(unicode)。 php 的 json_encode 有很多选项用于取消转义,例如 echo json_encode($some_var,JSON_PRETTY_PRINT + JSON_UNESCAPED_LINE_TERMINATORS + JSON_UNESCAPED_SLASHES + JSON_UNESCAPED_UNICODE); 时髦的字符是正确的单引号,但我不知道如何处理它。我为 json_encode 尝试了不同的选项,但它不起作用。我认为这应该在应用程序端处理,应该解释html实体代码,现在不是。 【参考方案1】:

尝试使用机器人Html library。您可以使用 fromHtml() 对 html 转义字符进行编码。

用法

import android.text.Html;

String yourString = Html.fromHtml(yourJsonString).toString();

// or use with a textview

yourTextView.setText(Html.fromHtml(yourJsonString));

【讨论】:

这很有趣,但不幸的是没那么简单,因为我需要将这些信息存储在本地数据库中,以避免每次都检索它们,并且 fromHtml 正在返回一个 Spanned 类型。 我觉得这是一个肮脏的把戏(因为 fromHtml 已被弃用)但它似乎有效,所以谢谢:) 我很想知道是否有更好的方法来做到这一点虽然:) 你能把它和 HTML 转义字符一样保存在本地数据库中吗?然后在文本视图中显示文本时使用 Html.fromHtml() ? 是的,这是可能的,但这意味着你每次想要显示它时都必须这样做,它不是很干净也不是很有效。 这不是一个非常常见的肮脏技巧,并且不推荐使用 fromHtml 他们只是更新 API 级别 24 中的输入。我会说你最好的选择是在你要显示文本时使用 HTML.fromHtml .它退出速度很快,并且确实是防止用户看到您的 HTML 转义字符的唯一方法。 :)

以上是关于从 JSON 到 Android 的右单引号的主要内容,如果未能解决你的问题,请参考以下文章

pcl6.exe v9.15 静默转换 APOSTROPHE => 右单引号

Latex特殊字符怎么输入

在android中将数据传递给json时单引号不起作用

iOS 中的 JSON 序列化双引号 (") 和单引号 (') 问题

如何在python中将单引号存储到postgres [重复]

如何将单引号 (') 捕获到 JSON.parse 的字符串中?