【问题标题】:JSON.parse() keep string encodedJSON.parse() 保持字符串编码
【发布时间】:2018-02-23 23:03:08
【问题描述】:
//string with correct json format

{"reaction":"\ud83d\udc4d","user":{"id":"xyz"}}

//after JSON.parse()

{ reaction: '????', user: [Object] }

我想做的是保持对反应值的编码,但JSON.parse() 并没有完全按照我的意愿行事。

更新

最后我决定不理会JSON.parse() 并按照@Brad 的建议修复数据库问题。我更改了数据库格式,但这还不足以解决问题,所以我找到了this。现在,每个语句都必须以 SET NAMES utf8mb4; 开头,然后是查询。同样在连接中,您必须拥有这些{charset : 'utf8mb4', multipleStatements: true}。如果没有正确的 node-mysql 文档,很难找到最佳答案,但最终我学到了很多东西,谢谢。

【问题讨论】:

  • 适合我吗?在 Chrome 63 上运行
  • 啊,你就是这个意思。
  • JSON.parse 不会对任何内容进行编码,在我看来,它就像是控制台或您以任何方式记录数据。解析数据的预期用途是什么?
  • @Adminy 你用什么来查看你的数据库,为什么不希望它显示为一堆问号?最好按原样存储实际字符,即使您正在查看数据库的工具不知道如何显示它们。
  • @Adminy 修复你的字符编码。你以完全错误的方式解决这个问题。不理会 JSON。

标签: javascript json node.js


【解决方案1】:

如果您不想解析以取消编码该字符串,那么您可以转义反斜杠,例如"\\ud83d\\udc4d"

您是否控制这些数据的来源?也许您想在JSON.stringify 中提供一个“替代者”来逃避这些,或者在JSON.parse 中提供一个“复活者”。

您有哪些选项可以控制字符串化或解析?

应用复活剂

const myReviver = (key, val) => key === "reaction" ? val.replace(/\\/g, "\\\\") : val;

var safeObj = JSON.parse(myJson, myReviver);

注意:这似乎在浏览器中不起作用,因为它似乎 \uxxxx 字符在字符串中解码 之前 reviver 能够对其进行操作,因此没有反斜杠可以转义了!

多次转义

从与 OP 的聊天中得知,使用 utf 字符向属性添加多个转义的反斜杠最终会导致所需的值存储在数据库中。在真正的 utf 字符最终被暴露之前,许多步骤都在取消反斜杠。

这很脆弱,远非可取,但它确实有助于确定什么是/不应该受到责备。

没有反斜杠

这似乎是最好的解决方案。在将数据转换为 utf 字符或以任何方式处理之前,从数据中去除 all 反斜杠。本质上是在数据库中存储停用“uxxxxuxxxx”代码。

通过使用正则表达式重新插入反斜杠,可以在渲染时将这些代码恢复为 utf 字符:

database_field.replace(/(u[0-9a-fA-F]{4})/g, "\\$1");

具有讽刺意味的是,这似乎跳过了 utf 解释,而您实际上最终得到了最初想要的字符串。因此,要强制它传递之前看到的字符,可以使用以下方式对其进行处理:

emoji = JSON.parse(`{"utf": "${myUtfString}"}`).utf;

【讨论】:

  • 为了回答你的问题,我可以控制我解析的字符串,但我必须操作字符串,我无法更改传入的格式。
  • 至于你提出的解决方案是我用更多的反斜杠来逃避反斜杠吗?我可以试试。
  • 是的,我的基本答案是避开你的反斜杠。我个人更喜欢在 stringify 中这样做,但听起来你在解析期间只有选项,所以提供了 reviver 的示例。
  • 我正要说我做了data.replace(/\\/g, "\\\\") 并且它有效但感谢您的解决方案!
  • 可悲的是,开始认为复活者毕竟不是解决方案。似乎字符在 恢复器能够操作它之前在字符串中被转换。所以应用于字符串可能是唯一的方法。在这种情况下,值得使用更健壮的正则表达式来仅转义该属性。
猜你喜欢
  • 1970-01-01
  • 2020-08-07
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
相关资源
最近更新 更多