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

思否 问答 👍 3 含 AI 优化版

问题

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

在 SegmentFault 查看原问题 →

由大模型辅助整理,保留原意,优化结构与可读性。

问题概述

提问者将数据以 JSON 形式存入本地存储(如 localStorage)后,再取出来时发现无法正常访问期望的键值(例如 params.orderID 取不到值),怀疑是存取过程中数据类型发生了变化。

涉及技术

JavaScript、JSON、localStorage

期望结果

希望排查出为什么取出的数据无法直接通过属性访问拿到键值,并得到正确的解析方式。

回答

原始回答

2020-05-13

先直接输出 params 看看是什么东西

typeof params 看看是 string 还是 object。我觉得 string 居多

如果是 object,那么直接输出 JSON.stringify(params) 看一下,讲道理 params.orderID 应该是有值的。

如果是 string,那么是需要 JSON.parse(params)

之后继续 typeof JSON.parse(params) ,继续套娃。

没报错就回到2步

报错就走4步

JSON.parse(String) 无法处理的情况可以尝试使用 eval

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

AI 优化 · 回答整理

解答思路

这类问题的根源几乎都出在「存入的是对象,取出来却当字符串用」或者反过来。可以按顺序排查:先打印取出的值本身,再用 typeof 判断它到底是字符串还是对象,是字符串就需要用 JSON.parse 转换成对象后再访问属性。

详细说明

排查步骤:

  1. 先直接打印 params,观察它长什么样。
  2. typeof params 判断类型:本地存储(如 localStorage)本身只能存字符串,因此从中取出的值大多是 string 类型。
  3. 如果是 object:说明已经是解析好的对象,直接用 JSON.stringify(params) 打印出来确认结构,此时 params.orderID 应该能正常取到值;如果依然取不到,说明键名本身有误,或数据结构和预期不一致。
  4. 如果是 string:说明取出来的还是原始的 JSON 字符串,需要先执行 JSON.parse(params) 转换成对象,才能通过 .orderID 之类的属性访问方式取值。转换后可以继续用 typeof 确认结果类型,如果嵌套了多层 JSON 字符串(即字符串里还是字符串),可能需要多次 JSON.parse
  5. 如果 JSON.parse 报错(数据格式非标准 JSON),再考虑用其他手段兜底解析;如果没有报错,回到第 2 步继续确认类型是否已经变成期望的对象。

需要格外说明的是:localStoragesessionStorage 等存储机制都只能保存字符串,存入对象前必须 JSON.stringify,取出后必须 JSON.parse,这是导致「存进去是对象,读出来却拿不到键值」最常见的原因。

小结

从本地存储读取数据「拿不到键值」,多半是因为忘记 JSON.parse 反序列化;养成用 typeof 先确认数据类型再访问属性的习惯,可以快速定位这类问题。

由大模型辅助整理,保留原意,补充结构与代码格式。

回答转载自 SegmentFault

评论

评论功能即将开放。你也可以通过 邮件GitHub Issue 反馈。