如何修复无效的随机字符串以使其 JSON 有效

Posted

技术标签:

【中文标题】如何修复无效的随机字符串以使其 JSON 有效【英文标题】:How to fix an invalid random string to make it JSON valid 【发布时间】:2022-01-04 00:55:42 【问题描述】:

javascript 中,我需要“修复”一个字符串,它应该是 JSON 有效的,但可能不是。该字符串具有以下格式(未知部分标有“”):

[
     "key_1": "ok_data", "key_2": "something_valid <INVALID_CHARS>",
     "key_1": "ok_data", "key_2": "some_valid_value"
]

"INVALID_CHARS" 是使 JSON.parse() 函数失败的字符。 错误始终定位在此数组元素的“key_2”属性上。

请注意,这些字符来自随机二进制数据,因此可以是任何字符。

我想找到最简单的解决方案,或者至少是最不容易出错的解决方案。

我想过替换无效字符,但是单反斜杠字符后跟非特殊字符也存在问题,也会引发错误或引号字符。 而且我可能没有想到所有可能的错误。

谢谢。

【问题讨论】:

是否要删除或替换无效字符? 如果INVALID_CHARS 包含"", foo: "bar",您如何知道一个值在哪里结束,而下一个值在哪里开始? 您是否尝试将所有"s 替换为\" 这是问题的一部分,是的。人眼会知道如何修复它,因为它会看到数组中的下一个有效对象。 我还需要删除无效字符,但我不知道如何找到所有这些字符的列表。那些在 JSON.parse() 中抛出“无效字符”错误的人。 【参考方案1】:

JSON 不允许包含任意二进制数据;它必须是一系列有效的 Unicode 代码点。 (通常这些以 UTF-8 编码传输,但无论如何,任意二进制数据都是不可能的。)因此,如果您想包含任意二进制数据,您需要弄清楚如何明确地对其进行编码以进行传输。如果您不以某种方式对其进行编码,那么您将无法可靠地区分恰好与" 具有相同代码的字节与终止字符串的"

您可以使用多种可能的编码,大多数语言中都存在标准库。最常用的一种是 base-64。

【讨论】:

我需要处理这些错误数据(至少暂时如此),因为发件人软件位于嵌入式设备中,目前无法升级。 :) @lath:如果幸运的话,会有一些不太可靠的信号表明任意数据的字符串是完整的。例如,如果数据确实看起来像您的样本,则可能您可以使用",\n 作为分隔符,这不太可能出现在随机数据中。您可以在解析 json 之前使用它来提取和删除二进制数据。或者您可以重新插入经过适当编码的二进制数据。真的,这取决于您的需求。【参考方案2】:

最好澄清问题,因为您似乎在这里描述了广泛的问题。如果您在解析上述结构时遇到问题,您只需要检查结构的句法完整性。例如这个结构很好解析

let var1 = JSON.parse('[
   
      "key_1":"ok_data",
      "key_2":"something_valid <INVALID_CHARS>"
   ,
   
      "key_1":"ok_data",
      "key_2":"some_valid_value"
   
]');

如果您需要将 替换为带有 json 字符的二进制数据,可以将 编码为 base64,因为这是最可靠的方式。但我想不仅将 打包到 base64 也是问题,而且问题也是架构问题,您需要准备 key_2 的值,其中包含有效部分和无效部分。这样,我建议将两个子字符串分开(拆分)key_2,用“”-"key_2": "something_valid &lt;INVALID_CHARS&gt;(can be omitted)" 分开。 此外,可以对字符串使用单独的字段而不会出错,而对错误使用第二个字段。赞这个"key_2_1": "something_valid", "key_2_2":&lt;INVALID_CHARS&gt;

如果可能的话,另一种方法是使用多部分表单数据来传输二进制数据

【讨论】:

以上是关于如何修复无效的随机字符串以使其 JSON 有效的主要内容,如果未能解决你的问题,请参考以下文章

如何修复我的代码以使其发送 json 数据作为对邮递员 GET 请求的响应?

将递增数字添加到 JSON 对象字符串以使其唯一

如何修复此代码,使其随机播放字母并且对第一个字母和最后一个字母、标点符号没有影响

BigQuery JSON 架构验证

如何修复我的代码以使其自动化?

修复无效 JSON 的最有效方法