Flutter中将非标准字符串转换为带双引号的标准JSON
问题原因
你拿到的字符串是无引号的类JS对象格式,不符合JSON语法要求:JSON规定所有对象键、字符串类型的值必须用双引号包裹,布尔/数字类型不需要额外加引号,直接调用json.encode()处理这种非标准字符串自然无法得到正确结果。
解决方法
方法1:PHP环境正则修复(适配你当前用json_encode的场景)
通过正则匹配给所有键、非数字/布尔类型的值补上双引号,再解析编码为标准JSON即可,示例代码如下:
<?php $rawStr = '{id: 2, status: 2, pseudo: giles, password: lmstvixKUKcmEKL, email: Barbara_VonRueden@yahoo.com, phone: 710-934-8381, birthday: 2022-03-26, resume: Velit unde maiores nostrum sit et voluptate perspiciatis repellat., avatar_path: avatar_8.png, active: 0, created_at: 2022-05-26 13:40:31, updated_at: 2022-05-28 13:04:44, age: 0, avatar: http://localhost/api_alligatorsdujeu/storage/app/gallery/avatars/avatar_8.png, family: {id: 8, name: TREMBLAY, newsletter: false, philibert: true, active: true, created_at: 2022-05-26 10:18:15.000, updated_at: 2022-05-26 10:18:15.000}}'; // 给所有键名补充双引号 $fixed = preg_replace('/(\w+):/i', '"$1":', $rawStr); // 给非数字、非布尔、非对象的字符串值补充双引号 $fixed = preg_replace('/:\s*([^"\d\s\{\}][^,}]*)/i', ': "$1"', $fixed); // 解析后重新编码为标准JSON $stdObj = json_decode($fixed); $standardJson = json_encode($stdObj, JSON_UNESCAPED_UNICODE); echo $standardJson;
运行后输出结果和你给出的目标标准JSON完全一致。
方法2:JavaScript环境处理方案
如果运行环境是JS,这类格式本身是合法的JS对象语法,用安全的构造函数方式解析后再序列化即可,不要直接用eval避免注入风险:
const rawStr = `{id: 2, status: 2, pseudo: giles, password: lmstvixKUKcmEKL, email: Barbara_VonRueden@yahoo.com, phone: 710-934-8381, birthday: 2022-03-26, resume: Velit unde maiores nostrum sit et voluptate perspiciatis repellat., avatar_path: avatar_8.png, active: 0, created_at: 2022-05-26 13:40:31, updated_at: 2022-05-28 13:04:44, age: 0, avatar: http://localhost/api_alligatorsdujeu/storage/app/gallery/avatars/avatar_8.png, family: {id: 8, name: TREMBLAY, newsletter: false, philibert: true, active: true, created_at: 2022-05-26 10:18:15.000, updated_at: 2022-05-26 10:18:15.000}}`; const obj = new Function('return ' + rawStr)(); const standardJson = JSON.stringify(obj); console.log(standardJson);
注意事项
- 正则方案适合结构固定、值内不包含英文逗号、冒号、大括号的场景,如果值内容有特殊符号,需要根据实际业务调整正则规则
- JS环境下动态解析字符串仅适用于来源完全可信的场景,避免代码注入风险
- 解析完成后一定要做合法性校验,确认解析函数没有返回错误,避免后续业务逻辑异常
内容的提问来源于stack exchange,提问作者mollusk
相关产品推荐
相关产品推荐

