You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js中使用useEffect读取localStorage时出现JSON输入意外结束错误

解决JSON.parse时"Unexpected end of JSON input"错误的方案

你的代码里有几个关键问题导致了这个错误:

  • localStorage.getItem返回null时,你设置的默认值是[](数组),但JSON.parse只能处理JSON格式的字符串,直接传数组会触发解析错误。
  • 组件首次渲染时,state的初始值是[],此时顶层的JSON.parse(data)相当于解析数组,直接抛出错误。
  • 解析逻辑放在组件顶层,会在useEffect执行前(也就是还没从localStorage拿到数据时)就运行,导致用初始state值解析出错。

修正后的代码如下:

const JobsPage = () => {
  const [jobData, setJobData] = useState([])

  useEffect(() => {
    // 不存在时用JSON格式的空字符串作为默认值
    const storedDataStr = window.localStorage.getItem("Job") || "[]"
    try {
      const parsedData = JSON.parse(storedDataStr)
      // 确保最终存入state的是数组类型
      setJobData(Array.isArray(parsedData) ? parsedData : [])
    } catch (err) {
      console.error("解析localStorage数据失败:", err)
      setJobData([])
    }
  }, [])

  // 直接使用jobData即可,无需额外解析
  return (
    // 这里写你的组件内容
  )
}

关键修正说明:

  1. 将默认值改为"[]"——这是合法的JSON空数组字符串,保证JSON.parse始终能拿到正确格式的输入。
  2. 用try/catch包裹解析逻辑——就算localStorage里存了非法JSON,也不会导致组件崩溃,还能捕获错误信息。
  3. 把解析逻辑移到useEffect内部——确保只有拿到localStorage数据后才进行解析,避免用初始state值触发错误。
  4. 增加Array.isArray校验——防止localStorage里存的是非数组类型数据,保证state始终是数组,避免后续业务逻辑出错。

内容的提问来源于stack exchange,提问作者Ahmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:15:09