从 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 => 右单引号
iOS 中的 JSON 序列化双引号 (") 和单引号 (') 问题