【问题标题】:Why the json.decoder.JSONDecodeError?为什么是 json.decoder.JSONDecodeError?
【发布时间】:2017-08-22 15:57:13
【问题描述】:

我正在尝试使用 logging.config.dictConfig() 配置我的 Python 日志记录模块

但是,我的 JSON 文件似乎已损坏,即使它作为 Python 字典工作,false 更改为 False,所以我认为这不是语法错误。

我的代码说:

import json

with open('logging_config.json') as f:
    d = json.load(f)

我的logging_config.json 文件是:

{
  "version": 1,
  "disable_existing_loggers": false,
  "formatters": {
    "standard": {
      "format": "[%(levelname)s] %(name)s: %(message)s"
    },
  },
  "handlers": {
    "default": {
      "level": "DEBUG",
      "formatter": "standard",
      "class": "logging.StreamHandler",
    },
  },
  "loggers": {
    "": {
      "handlers": ["default"],
      "level": "INFO",
      "propagate": true
    },
    "myfunc": {
      "handlers": ["default"],
      "level": "DEBUG",
      "propagate": false
    },
  }
}

当我运行那个简单的程序时,我得到一个错误:json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 8 column 3 (char 156)

什么可能导致 JSON 解码器失败?

提前感谢您的帮助。

【问题讨论】:

  • JSON 解析器期望每个键都有某种类型的值。字符串是一个可接受的值,整数是另一个。您正在尝试插入一个布尔值,但布尔值的大小写有所不同。只有一个是有效的布尔值。这是一些documentation
  • @ajoseps 这不是问题。问题是你有一个多余的逗号,所以 JSON 需要一个密钥。这个 JSON 是如何生成的?它肯定不是由 python json 模块
  • 它曾经是我手动转换的 Python 字典。 Python 原谅了额外的逗号,但 json 没有

标签: python json logging


【解决方案1】:

您有多个多余的逗号会破坏 JSON 反序列化。

这是您的原始 JSON,每个多余的逗号都指出:

{
  "version": 1,
  "disable_existing_loggers": false,
  "formatters": {
    "standard": {
      "format": "[%(levelname)s] %(name)s: %(message)s"
    }, # <--- extraneous comma
  },
  "handlers": {
    "default": {
      "level": "DEBUG",
      "formatter": "standard",
      "class": "logging.StreamHandler", # <--- extraneous comma
    }, # <--- extraneous comma
  },
  "loggers": {
    "": {
      "handlers": ["default"],
      "level": "INFO",
      "propagate": true
    },
    "myfunc": {
      "handlers": ["default"],
      "level": "DEBUG",
      "propagate": false
    }, # <--- extraneous comma
  }
}

删除这些,现在这是一个有效的 JSON 文档:

{
    "version": 1,
    "disable_existing_loggers": false,
    "formatters": {
        "standard": {
            "format": "[%(levelname)s] %(name)s: %(message)s"
        }
    },
    "handlers": {
        "default": {
            "level": "DEBUG",
            "formatter": "standard",
            "class": "logging.StreamHandler"
        }
    },
    "loggers": {
        "": {
            "handlers": ["default"],
            "level": "INFO",
            "propagate": true
        },
        "myfunc": {
            "handlers": ["default"],
            "level": "DEBUG",
            "propagate": false
        }
    }
}

【讨论】:

  • 啊,Python 原谅了这些多余的逗号。在将 Python 转换为 json 时我错过了它们。谢谢
【解决方案2】:

正如其他人已经回答的那样,您的 JSON 中有一些多余的逗号。

您可以将您的 JSON 提供给 https://jsonlint.com/ ;它往往会提供更有用的帮助信息。

【讨论】:

    【解决方案3】:

    这是因为您的 JSON 无效。这个 JSON 是有效的。 我从您的 JSON 中删除了多余的逗号。 您可以使用任何 JSON 验证器来修复它。

    {
      "version": 1,
      "disable_existing_loggers": false,
      "formatters": 
      {
        "standard": 
        {
          "format": "[%(levelname)s] %(name)s: %(message)s"
        }
      },
      "handlers": 
      {
        "default": 
        {
          "level": "DEBUG",
          "formatter": "standard",
          "class": "logging.StreamHandler"
        }
      },
      "loggers": 
      {
        "": 
        {
          "handlers": ["default"],
          "level": "INFO",
          "propagate": true
        },
        "myfunc": 
        {
          "handlers": ["default"],
          "level": "DEBUG",
          "propagate": false
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-20
      • 2021-12-20
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      相关资源
      最近更新 更多