【项目部署】JavaScript解析JSON解析报错Unexpected token xxx is not valid JSON

这篇具有很好参考价值的文章主要介绍了【项目部署】JavaScript解析JSON解析报错Unexpected token xxx is not valid JSON。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题背景

这个报错发生在之前部署的一个前后端分离的项目中。后端使用的Spring Boot,前端使用的JavaScript,前后端交互使用Thymeleaf框架。

现象

项目组的另一个小伙伴说,突然有个页面打不开了,整个页面全空白。我F12打开浏览器发现有如下报错:

【项目部署】JavaScript解析JSON解析报错Unexpected token xxx is not valid JSON,项目部署,javascript,json,开发语言

问题排查

首先我打开了JavaScript的代码部分,发现报错的是这一行:
【项目部署】JavaScript解析JSON解析报错Unexpected token xxx is not valid JSON,项目部署,javascript,json,开发语言
这里初步就能判断可能是数据文件(P.s. 这是一个txt文件,里面存放的是JSON格式的数据)的问题了。数据文件可能有些字符串是JavaScript语言的JSON库解析不了的(这个数据文件是一个Python程序生成的)。于是我又看了看数据,发现里面有NaN:
【项目部署】JavaScript解析JSON解析报错Unexpected token xxx is not valid JSON,项目部署,javascript,json,开发语言
之前我是不知道JSON有哪些是不合法字符的。所以我就查了一下JSON的官方规范文档The JavaScript Object Notation (JSON) Data Interchange Format。其中对于Values的描述如下:

【项目部署】JavaScript解析JSON解析报错Unexpected token xxx is not valid JSON,项目部署,javascript,json,开发语言
所以问题的原因很明显了:txt数据文件中有NaN,导致JavaScript的JSON库无法对其解析。

Bug复现

为了进一步证明我对于这个问题的原因的猜想是正确的,我尝试复现了这个bug。我在本地用JavaScript、Python两种语言的JSON解析库分别对同一个含有NaN的txt数据文件进行解析。由于我最近一直在写Python,所以先用的Python复现,再用的JavaScript复现的。

数据文件data.txt如下:

{
  "key": [
    40.5,
    NaN
  ]
}

按照JSON规范文档来看,这不是一个合法的JSON数据。

Python解析结果如下:

{'key': [40.5, nan]}

JavaScript解析结果如下:

Error parsing JSON: SyntaxError: Unexpected token N in JSON at position 30
    at JSON.parse (<anonymous>)

可以看得出来,JavaScript对这种文件的解析确实会报错。而Python居然是不报错的,说明不同语言的JSON解析库的实现差异还挺大的,Python的JSON解析库对于这种不符合JSON规范的不合法字符也能解析。

这里也吸取了一个教训:在复现的时候,一定要保证复现的环境和出现Bug的环境一模一样,不然就会出现我这种换了个语言又能解析的情况。。。

解决方案

在Python程序生成数据NaN的数据后,可以将其替换成其他合法的JSON字符串。文章来源地址https://www.toymoban.com/news/detail-727429.html

总结

  • JSON数据中不是所有字符都是合法的,具体参见JSON官方规范文档:The JavaScript Object Notation (JSON) Data Interchange Format
  • 保存任何格式的数据文件时候,尽量保证不要出现该格式文件规范中不合法的字符,除非所有语言都实现了对于这种格式的不合法字符的解析(但这显然不太可能)
  • 复现Bug的时候一定要保证复现环境和出现Bug的环境一模一样,包括语言、第三方库的版本等等

到了这里,关于【项目部署】JavaScript解析JSON解析报错Unexpected token xxx is not valid JSON的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • npm报错(npm ERR! Unexpected token ‘.‘)

    使用 nvm 将 node 切换到高版本后,运行 npm 相关的命令报的这个错 解决办法: 1、通过nvm list 命令查看当前都安装的node版本列表,依次通过 nvm uninstall [version] 命令将已经安装的 node 版本依次删除。 [version] 代表 node 版本号。 2、通过nvm root命令找到 nvm 安装位置, 双击 nvm

    2024年02月11日
    浏览(52)
  • npm install报错 -> npm ERR! Unexpected token ‘.‘ 报错解决办法。

    问题原因: 用nvm1.1.7的版本安装了16.x以上的node, 然后再下载依赖的时候就报错了; 总结一下就是nvm版本太低了,他的里面没有集成高版本node导致的。 解决办法: 把nvm切换到新版本就行了。 1. 卸载掉当前所有的node 有3个版本的node,我们要nvm uninstall 16.18.1, nvm uninstall 16.12.2…

    2024年02月14日
    浏览(55)
  • npm install报错 -> npm ERR! Unexpected token ‘.‘ 报错解决办法

    问题原因: 用nvm1.1.7的版本安装了16.x以上的node, 然后再下载依赖的时候就报错了; 总结一下就是nvm版本太低了,他的里面没有集成高版本node导致的。 解决办法: 把nvm切换到新版本就行了。 1. 卸载掉当前所有的node 有3个版本的node,我们要nvm uninstall 16.18.1, nvm uninstall 16.12.2…

    2024年02月14日
    浏览(51)
  • 【Node】node 报错:tagOffsetsMap[tag] ??= [];...SyntaxError: Unexpected token ,‘??=‘

    安装的 node 版本不支持空值赋值运算符(??=) 更换合适的 node 版本就行 更多支持请在 node.green 上查看各种语法支持的版本 NodeJS中的空合并赋值运算符(??=)

    2024年02月16日
    浏览(48)
  • 编译报错:Module parse failed: Unexpected token (18:41)

    error in ./node_modules/yargs/lib/platform-shims/esm.mjs Module parse failed: Unexpected token (18:41) You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders | const REQUIRE_DIRECTORY_ERROR = \\\'loading a directory of commands is not supported yet for ES

    2024年02月06日
    浏览(96)
  • jsx文件eslint报错 Parsing error: Unexpected token < eslint

    最近在使用react native开发app的发现一个问题: 报错详情: 可以看到,这是jsx的正确写法,并没有语法错误,但是eslint还是报错,大致意思就是意外的符号 ,可以大概推断是eslint没有正确解析jsx语法造成的,虽然程序可以正常运行,但是对于强迫症来说,确实受不了。 原因:

    2024年02月13日
    浏览(43)
  • vite项目 Uncaught Syntaxerror: Unexpected token > vue项目上线白屏

    在开发环境一直没有问题,但是到了生产环境,上线了显示白屏。检查了nginx配置以及web存放位置的对应关系都没有问题,结果打开控制台输出:Uncaught Syntaxerror: Unexpected token ? 这个很明显是语法错误。但是在生产环境能使用,于是赶紧让同事检查了浏览器版本,结果是他那边

    2024年02月13日
    浏览(47)
  • 小程序原生使用wxs踩坑:使用正则replace字符串报错Unexpected token `/`

    WXS(WeiXin Script)是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构。也就是说,使用wxs模块可以在wxml中使用js方法,类似于vue中的过滤器。 详细介绍见 wxs语法参考 在我新建的filter.wxs文件中写入方法后 然后就报错: 然后我用 RegExp 对象转了一下 编译又报以下错误

    2024年02月15日
    浏览(39)
  • 解决报错SyntaxError:Unexpected end of JSON input

    跳转页面传递参数 报错提示 SyntaxError:Unexpected end of JSON input 原因:若对象的参数或数组的元素中遇到地址中包括? - _ . ! ~ * \\\' ( )等特殊符号时,对象/数组先要通过JSON.stringify转化为字符串再通过 encodeURIComponent 编码,接收时,先通过 decodeURIComponent 解码再通过JSON.parse转换为

    2024年02月11日
    浏览(53)
  • MyBatis报错 Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: “(“ “(“

    MyBatis 使用报错 Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: \\\"(\\\" \\\"(\\\"at line 12, column 24. 问题原因: 原因是因为mybatisplus不识别sql查询语句中的返回使用函数 MyBatis版本升级到v3.5.1以上 错误日志: ApiPostj接口测试时发生错误回显 Mapper接口(传日期格式) Mapper.xml 解

    2024年02月04日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包