【问题标题】:Trying to save object as JSON and load in python试图将对象保存为 JSON 并在 python 中加载
【发布时间】:2015-09-26 14:23:24
【问题描述】:

我正在尝试从 powershell 中的对象创建 JSON 文件,我可以很好地保存它,但是当我尝试从 python 脚本加载它时,我总是收到错误:ValueError: Expecting value: line 1 column 1 (字符 0)

这是 powershell 单行代码:

$devices = Get-WmiObject Win32_PNPEntity | where {$_.ConfigManagerErrorcode -ne 0}  | Select Name, CompatibleID | ConvertTo-Json | Out-File file.json

我相信这是因为 powershell 保存它的方式,它看起来像这样:

[
    {
        "Name":  "PCI Data Acquisition and Signal Processing Controller",
        "CompatibleID":  [
                             "PCI\\VEN_8086\u0026DEV_A161\u0026REV_31",
                             "PCI\\VEN_8086\u0026DEV_A161",
                             "PCI\\VEN_8086\u0026CC_118000",
                             "PCI\\VEN_8086\u0026CC_1180",
                             "PCI\\VEN_8086",
                             "PCI\\CC_118000",
                             "PCI\\CC_1180"
                         ]
    },
    {
        "Name":  null,
        "CompatibleID":  [
                             "*PNP0CA0"
                         ]
    },
    {
        "Name":  "PCI Data Acquisition and Signal Processing Controller",
        "CompatibleID":  [
                             "PCI\\VEN_8086\u0026DEV_A127\u0026REV_31",
                             "PCI\\VEN_8086\u0026DEV_A127",
                             "PCI\\VEN_8086\u0026CC_118000",
                             "PCI\\VEN_8086\u0026CC_1180",
                             "PCI\\VEN_8086",
                             "PCI\\CC_118000",
                             "PCI\\CC_1180"
                         ]
    },
    {
        "Name":  "Base System Device",
        "CompatibleID":  [
                             "PCI\\VEN_8086\u0026DEV_1911\u0026REV_00",
                             "PCI\\VEN_8086\u0026DEV_1911",
                             "PCI\\VEN_8086\u0026CC_088000",
                             "PCI\\VEN_8086\u0026CC_0880",
                             "PCI\\VEN_8086",
                             "PCI\\CC_088000",
                             "PCI\\CC_0880"
                         ]
    },
    {
        "Name":  "PCI Device",
        "CompatibleID":  [
                             "PCI\\VEN_8086\u0026DEV_A135\u0026REV_31",
                             "PCI\\VEN_8086\u0026DEV_A135",
                             "PCI\\VEN_8086\u0026CC_000000",
                             "PCI\\VEN_8086\u0026CC_0000",
                             "PCI\\VEN_8086",
                             "PCI\\CC_000000",
                             "PCI\\CC_0000"
                         ]
    }
]

这是python脚本:

import json
with open(r"C:\Users\azeleznx\PycharmProjects\Intel-Python-project\IT_Spider\scripts\file.json", 'r') as file:
    read = json.load(file)
    print(read)

和错误:

Traceback (most recent call last):
  File "C:/Users/Alex/PycharmProjects/Intel-Python-project/test21.py", line 3, in <module>
    read = json.load(file)
  File "C:\Python34\lib\json\__init__.py", line 268, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
  File "C:\Python34\lib\json\__init__.py", line 318, in loads
    return _default_decoder.decode(s)
  File "C:\Python34\lib\json\decoder.py", line 343, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python34\lib\json\decoder.py", line 361, in raw_decode
    raise ValueError(errmsg("Expecting value", s, err.value)) from None
ValueError: Expecting value: line 1 column 1 (char 0)

现在我知道 JSON 对象应该以大括号开头和结尾,但我似乎无法让 powershell 以正确的方式保存它。

编辑

感谢 Robᵩ 为我提供答案,这是完整的脚本,用尽可能少的几行代码

import subprocess
import json

command = "Write-Host (Get-WmiObject Win32_PNPEntity | where {$_.ConfigManagerErrorcode -ne 0}  " \
          "| Select Name, CompatibleID | ConvertTo-Json)"

out = json.loads(subprocess.check_output(["powershell.exe", '-ExecutionPolicy', 'Unrestricted', command]).decode("utf-8"))
print(out)

【问题讨论】:

  • 你用什么来加载json?我尝试加载上面的,它对我有用
  • 尝试只保存一个对象,而不是整个集合。假设您使用$object.ToJSON(),而不是使用$object[0].toJSON()
  • 感谢 Alex,包含给您带来麻烦的 JSON 文本。还请包括演示您所看到的错误的最小的完整 Python 程序。有关完整示例的更多信息,请参阅stackoverflow.com/help/mcve
  • "现在我知道 JSON 对象应该以大括号开头和结尾" - 根据RFC7158,这不是真的。
  • 已编辑的帖子包含更多信息。

标签: python json powershell


【解决方案1】:

这是我根据不完整信息的猜测:

您已使用 utf16 编码将文件保存在 powershell 中,但您正在使用 utf8 编码在 Python 中打开文件。

尝试在 Python 脚本中打开文件时指定正确的编码。如何做到这一点取决于您使用的是 Python2 还是 Python3。

【讨论】:

    猜你喜欢
    • 2020-06-05
    • 2018-10-24
    • 2022-12-07
    • 2021-05-01
    • 2013-09-04
    • 2021-04-08
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多