React Native JSON.stringify 无法序列化循环结构

问题描述 投票:0回答:5

我们正在构建一个 RN 应用程序 (RN0.37),我们遇到了一个问题,即当应用程序运行时,我们会得到一个“

TypeError: JSON.stringify cannot serialize cyclic structures
”。

API 响应没有任何相关变化,问题最近消失了,但在擦除/重建时重新出现(由不相关的问题触发)。

我怀疑正在使用的几个软件包:“

react-native-router-flux
”和“
react-native-permissions
”,但我在应用程序中找不到任何相关内容。

目前我对“react-native-router-flux”的怀疑主要基于这篇文章:https://github.com/aksonov/react-native-router-flux/issues/363

我对“react-native-permissions”的怀疑主要是基于这样一个事实:在这个项目中包含这个包的时间是可疑的,并且似乎与这个错误的出现相符 - 尽管我无法证明绝对确定。

我唯一的额外线索是 JSON.stringify 错误似乎总是前面有警告列表。他们都读到“出于性能原因,此合成事件被重用。如果您看到此内容,则说明您正在访问已发布/无效的合成事件的属性。该属性设置为 null。如果您必须保留原始合成事件,使用

event.persist()
。有关更多信息,请参阅 https://facebook.github.io/react/docs/events.html#event-pooling。”列表如下(始终按相同顺序):nativeEvent、type、target、currentTarget、eventPhase、bubbles、cancelable、timeStamp、defaultPrevented、isTrusted 和 touchHistory。

以下是我的package.json:

"dependencies": {
  "blueimp-md5": "2.5.0",
  "moment": "2.16.0",
  "phone-formatter": "0.0.2",
  "react": "15.3.2",
  "react-native": "0.37.0",
  "react-native-asset-library-to-base64": "1.0.1",
  "react-native-aws3": "0.0.3",
  "react-native-button": "1.7.1",
  "react-native-cached-image": "1.2.2",
  "react-native-camera-kit": "4.0.1",
  "react-native-camera-roll-picker": "1.1.9",
  "react-native-contacts": "0.5.2",
  "react-native-fbsdk": "0.4.0",
  "react-native-fetch-blob": "0.10.0",
  "react-native-fs": "2.0.1-rc.2",
  "react-native-geocoder": "0.4.5",
  "react-native-image-crop-picker": "0.10.5",
  "react-native-image-resizer": "0.0.12",
  "react-native-nav": "1.1.4",
  "react-native-permissions": "0.2.5",
  "react-native-photo-view": "1.2.0",
  "react-native-router-flux": "3.37.0",
  "react-native-stripe": "1.2.1",
  "react-native-swipe-list-view": "0.3.1",
  "react-redux": "4.4.6",
  "redux": "3.6.0",
  "redux-storage": "4.1.1",
  "redux-storage-engine-reactnativeasyncstorage": "1.0.2",
  "underscore": "1.8.3"
}
ios json react-native react-native-router-flux cyclic
5个回答
12
投票

将此 getCircularReplacer 函数作为第二个参数传递到

JSON.stringify()
将修复此错误:

const getCircularReplacer = () => {
    const seen = new WeakSet();
    return (key, value) => {
    if (typeof value === "object" && value !== null) {
        if (seen.has(value)) {
            return;
        }
        seen.add(value);
    }
    return value;
    };
};

然后您可以按如下方式使用它:

JSON.stringify(circularReference, getCircularReplacer());
// {"otherData":123}

5
投票

JSON.stringify 无法处理引用自身或自身部分的 JSON 对象。

链接

我为懒人制作了一个简单的库,它重写了 JSON.stringify() 以允许它处理循环引用而不产生异常。它使您无法更改第三方库中与此限制有关的任何内容。在代码的引导程序中安装它。

链接2


4
投票

您正在为 REACT NATIVE 写作,但似乎您在 textInput 上使用了 onChange 而不是 onChangeText,当您对文本输入的更新值感兴趣时,这是 React Native 的正确方法,


0
投票

花了半天时间,我发现了这个很棒的方法,特别是对于React Naive,首先安装

json-stringify-safe
,如果你使用Typescript,也安装它
@types/json-stringify-safe

然后我准备了这两个utils函数:

import serialize from 'json-stringify-safe';

const stringify = (any: any): string => serialize(any);

const parsify = (serializedString: string): any => eval(`(${serializedString})`);

0
投票

当我尝试解析循环引用时,我在 React Native (0.73.1) 应用程序上遇到了这个问题。 我将节点版本从

18
更新为
20.11.0
。然后错误就消失了。

© www.soinside.com 2019 - 2024. All rights reserved.