json,本地存储后再取出来拿不到键值
问题
json,本地存储后再取出来拿不到键值
由大模型辅助整理,保留原意,优化结构与可读性。
问题概述
提问者将数据以 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 转换成对象后再访问属性。
详细说明
排查步骤:
- 先直接打印
params,观察它长什么样。 - 用
typeof params判断类型:本地存储(如localStorage)本身只能存字符串,因此从中取出的值大多是string类型。 - 如果是
object:说明已经是解析好的对象,直接用JSON.stringify(params)打印出来确认结构,此时params.orderID应该能正常取到值;如果依然取不到,说明键名本身有误,或数据结构和预期不一致。 - 如果是
string:说明取出来的还是原始的 JSON 字符串,需要先执行JSON.parse(params)转换成对象,才能通过.orderID之类的属性访问方式取值。转换后可以继续用typeof确认结果类型,如果嵌套了多层 JSON 字符串(即字符串里还是字符串),可能需要多次JSON.parse。 - 如果
JSON.parse报错(数据格式非标准 JSON),再考虑用其他手段兜底解析;如果没有报错,回到第 2 步继续确认类型是否已经变成期望的对象。
需要格外说明的是:localStorage、sessionStorage 等存储机制都只能保存字符串,存入对象前必须 JSON.stringify,取出后必须 JSON.parse,这是导致「存进去是对象,读出来却拿不到键值」最常见的原因。
小结
从本地存储读取数据「拿不到键值」,多半是因为忘记 JSON.parse 反序列化;养成用 typeof 先确认数据类型再访问属性的习惯,可以快速定位这类问题。
由大模型辅助整理,保留原意,补充结构与代码格式。
回答转载自 SegmentFault