Javascript 如何修复';无法将java.lang.String类型的值转换为JSONObject';React Native中的mergeitem出错

Javascript 如何修复';无法将java.lang.String类型的值转换为JSONObject';React Native中的mergeitem出错,javascript,react-native,Javascript,React Native,我想用mergeItem方法更新AsyncStorage中的名称值。我将密钥(时间戳)传递给该特定项的函数 但是我不能存储字符串的值。AsyncStorage仅由作为值(作为字符串)的名称和作为键的时间戳组成 updateName = async(key) => { if (this.state.name !== '') { await AsyncStorage.mergeItem(key, JSON.stringify(th

我想用mergeItem方法更新AsyncStorage中的名称值。我将密钥(时间戳)传递给该特定项的函数

但是我不能存储字符串的值。AsyncStorage仅由作为值(作为字符串)的名称和作为键的时间戳组成

updateName = async(key) => {
            if (this.state.name !== '') {  
                  await AsyncStorage.mergeItem(key, JSON.stringify(this.state.name))
                        .then( () => {
                              this.props.navigation.goBack();
                        } )
                        .catch(error => console.log(error))
            }
      }
下面是调用函数
updateName

Value a of type java.lang.String cannot be converted to JSONObject
- node_modules\react-native\Libraries\Storage\AsyncStorage.js:347:24 in convertError
- node_modules\react-native\Libraries\Storage\AsyncStorage.js:119:35 in <unknown>
- ... 5 more stack frames from framework internals
无法将java.lang.String类型的值转换为JSONObject -convertError中的节点\u modules\react native\Libraries\Storage\AsyncStorage.js:347:24 -中的节点\u modules\react native\Libraries\Storage\AsyncStorage.js:119:35 - ... 框架内部再增加5个堆叠框架 JSON.stringify()需要有效的JSON才能转换为字符串,如:

var obj = { name: "John", age: 30, city: "New York" };  // correct json
var myJSON = JSON.stringify(obj);

var name = "Test" // incorrect json
var myJSON = JSON.stringify(name);   // will through exception

根据“合并现有键值和输入值,假设两个值都是字符串化的JSON。返回承诺对象。”

如果必须只保存字符串,则不应在“AsyncStorage.setItem”之后调用合并字符串。您必须调用“AsyncStorage.setItem”来重置字符串

如果要保存每个时间戳的值,可以使用“mergeItem”

示例代码

const nameObject = {
  [Date.now().toString()]: "Chris"
};
await AsyncStorage.mergeItem("NAMES", JSON.stringify(nameObject));
const getNames = await AsyncStorage.getItem("NAMES");

console.log("getNames", getNames);

const nameObject2 = {
  [Date.now().toString()]: "Harry"
};
await AsyncStorage.mergeItem("NAMES", JSON.stringify(nameObject2));
const getNamesAfterUpdate = await AsyncStorage.getItem("NAMES");

console.log("getNamesAfterUpdate", getNamesAfterUpdate);
输出


此.state.name的
值是多少。你确定它有正确的JSON格式吗?我只是一个使用AsyncStorage.setItem(Date.now().toString(),this.state.name)的字符串。日期是键,名称只是一个字符串。您可以记录名称和键吗。因为它是合并到一个对象中的,所以我可以假设合并后的对象不是有效的JSON,所以无法转换。是的,我可以记录名称和键,它看起来是字符串。另外,typeof(name)表示它是字符串。非常感谢。现在我明白了事情是如何运作的。非常感谢。