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

Python json.loads解析JSON报错原因及不同引号写法区别说明

引号规则与json.loads解析差异说明

Python字符串的引号基础规则

  • Python中定义普通字符串时,单引号(')和双引号(")没有功能差异,只要首尾使用同一种引号包裹,就会被识别为字符串。两种引号的唯一使用区别是:如果字符串内部包含和外层包裹符相同的引号,需要用反斜杠\转义,否则Python会判定字符串提前终止。
  • 举个最简单的例子:'abc"def'和"abc'def"都是合法字符串,前者内容里的双引号、后者内容里的单引号都是普通字符,不需要转义;但如果写'abc'def',Python会认为字符串在第二个单引号位置就结束了,后面的def会直接触发语法错误。

三个测试案例的结果差异原因

首先明确JSON解析的核心规则:JSON语法要求所有字符串类型的值必须用双引号包裹,解析器从输入的第一个字符开始匹配合法JSON值,一旦匹配到一个完整合法的JSON值后,后面如果还有剩余未解析的内容,就会抛出Extra data异常。
下面逐个分析案例:

  1. 第一个正常运行的案例
    代码里h = '[{"b": [2, 4], "c": 3.0, "a": "A"}]'用单引号做外层包裹,h的实际内容就是[{"b": [2, 4], "c": 3.0, "a": "A"}],这是标准的JSON数组结构,没有多余字符,所以json.loads可以正常解析为Python列表。

  2. 第二个抛出异常的案例
    代码里h = '"[{"b": [2, 4], "c": 3.0, "a": "A"}]"'同样用单引号做外层包裹,h的实际内容开头多了一个双引号,完整内容为:

    "[{"b": [2, 4], "c": 3.0, "a": "A"}]"
    

    解析器读到第一个字符是双引号,会判定当前要解析的是一个JSON字符串值,按照规则会一直向后查找,直到碰到下一个未转义的双引号就判定字符串结束——这个结束的双引号正好是"b"前面的那个双引号,位置在字符索引3(对应报错里的column 5)。此时解析器已经拿到了一个完整的JSON字符串值"[{",但后面还跟着b": [2, 4]...这些未被解析的内容,所以直接抛出Extra data异常。

  3. 第三个正常运行的案例
    代码里h = '"hey"'用单引号做外层包裹,h的实际内容是"hey"。解析器读到开头双引号判定是JSON字符串,向后查找时,下一个未转义的双引号正好在整个内容的末尾,匹配到完整的字符串值hey,没有多余内容,所以可以正常解析为Python字符串'hey'。

补充说明:如果想要第二个案例也能正常解析,需要把JSON结构内部的双引号做转义,写成h = '"[{\\"b\\": [2, 4], \\"c\\": 3.0, \\"a\\": \\"A\\"}]"',此时h的实际内容是一个合法的JSON字符串,值为[{"b": [2, 4], "c": 3.0, "a": "A"}],json.loads会正常返回这个字符串结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:06:51