uni-app中JSON.parse解析JSON.stringify生成的字符串失败

发布于 1周前 作者 zlyuanteng 来自 Uni-App

uni-app中JSON.parse解析JSON.stringify生成的字符串失败
getStorageSync 中取值用 JSON.stringify 转字符串让 JSON.parse 解析数据,解析失败。

getStorageSync 打印的值写在代码中解析可以成功。

image image


16 回复

dataSync和aaa数据看看


回复 sssxxxddd: 看起来正常

回复 sssxxxddd: 用typeof打印下aa和aaa,看是不是一样

回复 蔡cai: aa的数据就是从aaa复制过来的,一模一样

回复 sssxxxddd: typeof打印下类型看下

回复 sssxxxddd: 实在不行用这个就好了,JSON.parse

回复 sssxxxddd: 感觉aa类型的UTSJSONObject,aaa的类型是string

忙去了,你自己试试吧

回复 蔡cai: 问题已经解决 中间不用 JSON.stringify转换直接把 getStorageSync 返回的数据toString放到 JSON.parse中就可以解析了,谢谢

回复 sssxxxddd: okok

dataSync和aaa数据

我用的时候没像你那样,直接用的没遇到问题

还是js好,uts就算了

|| 这种写法我这里编译不过,不过我这里解决了这个问题

最终这样写就好了,不用JSON.stringify转字符串

在uni-app中,如果你遇到JSON.parse解析JSON.stringify生成的字符串失败的情况,这通常是由于以下几个原因导致的:

  1. 循环引用:如果对象中存在循环引用,JSON.stringify会抛出一个错误或者返回一个空对象(取决于具体的实现和平台)。
  2. 特殊值JSON.stringify不能序列化undefinedfunctionSymbol等JavaScript中的特殊值。
  3. 字符编码问题:字符串在传输或存储过程中可能被错误地编码或解码。

首先,确保你的对象中没有循环引用和不可序列化的值。以下是一个简单的示例,展示如何安全地使用JSON.stringifyJSON.parse,同时处理循环引用的问题:

// 定义一个简单的对象结构
let obj = {
    name: "Alice",
    friend: null
};

// 引入循环引用
obj.friend = obj;

// 使用 replacer 参数处理循环引用
function replacer(key, value) {
    if (key === 'friend') {
        return undefined; // 或者返回一个标记,比如 null 或者一个特殊字符串
    }
    return value;
}

try {
    let stringified = JSON.stringify(obj, replacer);
    console.log("Stringified JSON:", stringified);

    let parsed = JSON.parse(stringified);
    console.log("Parsed Object:", parsed);
} catch (error) {
    console.error("Error during JSON processing:", error);
}

在这个例子中,replacer函数用于检测并处理循环引用。当键为friend时,它返回undefined,从而避免了循环引用的序列化问题。

此外,如果你担心特殊值的问题,你可以在序列化之前清理这些值,或者编写一个更复杂的replacer函数来处理这些情况。例如,你可以将undefined转换为null,或者忽略包含function的属性。

字符编码问题通常发生在数据从服务器传输到客户端或从文件读取时。确保在传输或存储之前,JSON字符串被正确地编码为UTF-8,并且在读取或接收时被正确地解码。

最后,如果你仍然遇到问题,建议检查你的uni-app环境是否有特定的限制或bug,或者尝试在不同的设备或模拟器上运行你的代码以排除环境因素的影响。在开发过程中,使用try-catch块来捕获并处理可能的错误也是一个好习惯。

回到顶部