【问题标题】:JSON/Python - decodingJSON/Python - 解码
【发布时间】:2016-11-09 20:42:54
【问题描述】:

我有一个 json 格式的文件,'datastores.json',看起来像这样:

{
"{'ESXi_Host': 'elvis.lab.vsphere.com'}": {
    "elvis.data": {
        "capacity": 293131517952, 
            "uuid": "57431578-630f1322-7bf2-00212883a5b0", 
            "vmfs_version": "5.60", 
            "ssd": false, 
            "extents": [
                "mpx.vmhba1:C0:T1:L0"
            ], 
            "local": true

我在上面运行以下代码:

import json

with open("C:\PyVmomi_out\\datastores.json") as json_file:
datastores = json.loads(json_file.read())
for dstor in datastores:
    esx_host = dstor['ESXi_Host']
    datastore = dstor['datastore']

我收到以下错误:

TypeError: string indices must be integers

在这一行:

esx_host = dstor['ESXi_Host']

我知道它需要一个整数。从我一直在做的阅读来看,如果我加入

'json.loads'

而不是

'json.load'

也被替换

'(json_file.read())'

而不是

'(json_file)'

然后它将文件作为字符串读取并允许字符串解析而不是整数。为什么这不起作用?

【问题讨论】:

    标签: python json amazon-dynamodb reformat pyvmomi


    【解决方案1】:

    一个问题是你的 .json 中没有“ESXi_Host”键,它说

    "{'ESXi_Host': 'elvis.lab.vsphere.com'}"
    

    注意""周围,关键是"{'ESXi_Host': 'elvis.lab.vsphere.com'}"(这是单个字符串)。

    其次,加载的对象可能是字典,因此是形式的迭代

    for dstor in datastors:
    

    超过(键是字符串,只有整数索引),而不是值,访问值做类似的事情

    for _, dstor in datastors.iteritems():
    

    打印您的 datastores 并调查您解析的 .json 的确切结构。

    【讨论】:

    • 我没有意识到单个字符串会有问题。错误消息提到“整数”,令人困惑。我正在努力弄清楚如何修复格式,以便两个字符串确实被拆分。用于以 json 格式拉取 ESXi 主机/数据存储的脚本使主机/数据存储名称成为主键。对于 dynamoDB,我需要它们将“ESXi_Host”和“datastore”标签作为主键,并将相应的名称作为键值。事实证明这比我想象的要困难。我将回到从 vsphere 中提取数据并继续尝试修改它的脚本。再次感谢!
    • 关于整数的错误来自错误的迭代。你遍历键,键是字符串,字符串只有整数索引。
    猜你喜欢
    • 2011-07-21
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多