如何修复无效的随机字符串以使其 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"
]');
如果您需要将 key_2
的值,其中包含有效部分和无效部分。这样,我建议将两个子字符串分开(拆分)key_2
,用“”-"key_2": "something_valid <INVALID_CHARS>(can be omitted)"
分开。
此外,可以对字符串使用单独的字段而不会出错,而对错误使用第二个字段。赞这个"key_2_1": "something_valid", "key_2_2":<INVALID_CHARS>
如果可能的话,另一种方法是使用多部分表单数据来传输二进制数据
【讨论】:
以上是关于如何修复无效的随机字符串以使其 JSON 有效的主要内容,如果未能解决你的问题,请参考以下文章
如何修复我的代码以使其发送 json 数据作为对邮递员 GET 请求的响应?