//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正确的文档,很难找到最佳答案,但最后我还是要学到很多东西,谢谢。
答案 0 :(得分:1)
如果你不想解析那个字符串,那么你可以逃避反斜杠,例如: "\\ud83d\\udc4d"
您是否控制数据的来源?也许你想提供一个"替换者"在JSON.stringify中逃避这些,或者#34;复活"在JSON.parse。
你有什么选择来控制stringify或解析?
const myReviver = (key, val) => key === "reaction" ? val.replace(/\\/g, "\\\\") : val;
var safeObj = JSON.parse(myJson, myReviver);
注意:这似乎无法在浏览器中运行,因为在 reviver能够对其进行操作之前,\ uxxxx字符在字符串中被解码,因此没有任何反斜杠可以逃脱!
继续与OP聊天后发现,使用utf字符向属性添加多个转义反斜杠最终会导致所需的值存储在数据库中。许多步骤都是在反斜杠中取消,直到真正的utf角色最终暴露出来。
这很脆弱,远非可取,但它确实有助于确定什么是/不是责任。
这似乎是最好的解决方案。在将数据转换为utf字符或以任何方式处理之前,从数据中删除所有反斜杠。基本上存储已停用" uxxxxuxxxx"数据库中的代码。
通过使用正则表达式重新插入反斜杠,可以在渲染时将这些代码恢复为utf字符:
database_field.replace(/(u[0-9a-fA-F]{4})/g, "\\$1");
具有讽刺意味的是,这似乎跳过了utf解释,你实际上最终得到了首先想要的字符串。因此,为了强制它传递之前看到的角色,可以使用以下方法处理:
emoji = JSON.parse(`{"utf": "${myUtfString}"}`).utf;