json,本地存储后再取出来拿不到键值

ethanYin
  • 125
因为是混合开发,ios那边给的数据,我只能把数据放到(手机安装的app)页面来看,打印不出来

给的值大概是这样子,此时由键取值是失败的

587927ecd8c2725507c1e67a91fcae8.jpg

我做了如下处理,存储和当前页面保存:

this.paramsInfo = params
localStorage.setItem('params', params)

我要用的时候


    const params: string | null = localStorage.getItem('params')
    if (params) {
      // 方式1
      // const p = JSON.parse(params)
      // this.viewData = p // 页面显示不出来
      // this.orderInfo = p.orderID
      
      // 方式2
      const p = JSON.parse(JSON.stringify(params))
      this.viewData = p // 页面呈现一样的数据
      this.orderInfo = p.orderID // 依旧无法获取

      const { token } = p.userInfo
      this.$https.orderDetails.getDetails({ token, id: p.orderID }).then((res: fetchResponse) => {
        if (res.flag === 1) {
          this.orderInfo = { ...res.data }
        }
      })
    }

仅在方式2时在页面呈现如下如数据(和前面一样)

d4f0b951b1328fbb86697ea58c00e36.jpg

无论如何,我都取不到它的键值,我该如何做?

回复
阅读 3k
4 个回答

首先感谢 linong与hfhan的回答,给了我很多思路,谢谢~~

我的问题是数据错了,大家注意到我的数据没有,ios给我的JSON字符串,这个没问题。
但是因为当时传的数据比较多,想一次性传过来,然后userInfo(json对象)被变为了json字符串后再赋值给另一个JSON对象的键,最后再把那个最终的json对象序列化(字符串化)后传给我,这样放在页面没问题,但是JSON.parse就会报错,大概意思如下:
9fb63d2f5d39740476084cdcea5347b.png
oa是最终给我的数据。最后解析失败了,自然其它键值就获取不到了,app页面我又捕获不到错误,很难受~~~

总结: JSON对象的键值不能是被序列化(stringify)的JSON对象,否则解析时报错!

linong
  • 26k
  1. 先直接输出 params 看看是什么东西
  2. typeof params 看看是 string 还是 object我觉得 string 居多

    1. 如果是 object,那么直接输出 JSON.stringify(params) 看一下,讲道理 params.orderID 应该是有值的。
    2. 如果是 string,那么是需要 JSON.parse(params)
  3. 之后继续 typeof JSON.parse(params)继续套娃

    1. 没报错就回到2步
    2. 报错就走4步
  4. JSON.parse(String) 无法处理的情况可以尝试使用 eval

先证明一下 typeof 是肯定好使的
image.png

localStorage存取都是针对字符串操作的,所以你存之前需要转成字符串,取出来后再JSON.parse。而不是直接存,取出来后JSON.parse(JSON.stringify(params))

jsoncode
  • 3.9k

其实答案楼上两位朋友已经帮你解决了。只是没用统一整合,并分析每一步的原因:

就拿这3行代码说吧

this.paramsInfo = params
localStorage.setItem('params', params)

const params: string | null = localStorage.getItem('params')

单独看3行代码,localStorage.setItem('params', params)这一句字面上有bug,先不管是否是这句导致的,先解决了。

if(typeof params==='object'){
    localStorage.setItem('params', JSON.stringify(params))
}else if(typeof params === 'string'){
    localStorage.setItem('params', params)
}else{
    alert('数据格式是:'+typeof params)
}

我猜测问题应该是转换这一步操作没做好容错处理。

if(param){
    let p = '';
    try{
        p = JSON.parse(param)
    }catch(e){
        // debugger 看看报的什么错误, 正式环境注释掉alert
        // 不出意外的话,可能和你之前存储的脏数据有关系。
        alert(e.toString())
        p = {};
    }
}

另外

const { token } = p.userInfo.token

这种定义语法我不知道正确与否,我测试会报错。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏