【问题标题】:Python Json.loads() error ValueError: No JSON object could be decodedPython Json.loads() 错误 ValueError: No JSON object could be decoded
【发布时间】:2018-10-18 22:46:30
【问题描述】:

我正在尝试使用 json.loads() 加载 JSON 输出文件。但是,脚本失败并出现以下错误。有人对此有任何想法吗?

基本上,我有一个 REST API GET 调用,可以将数据输出到文件中,我会在 python 脚本中读取文件并独立处理数据。

我是 python 和 REST API 的新手,因此很难解决这个问题。非常感谢任何帮助。

#Error:

Traceback (most recent call last):
  File "./HDS_Tier_Relocation_Status.py", line 40, in <module>
    foo(row['storageDeviceId'], row['model'], 
row['serialNumber'],row['svpIp'], row['protocol'], row['svpHost'], 
row['tmServer'], ['tmPort'], row['tmAgent'], row['tmInstance'])
  File "./HDS_Tier_Relocation_Status.py", line 30, in foo
    pootdata = json.loads(filename) # Load JSON to a variable
  File "/usr/lib64/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/usr/lib64/python2.7/json/decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib64/python2.7/json/decoder.py", line 383, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

代码:

import os
import csv
import smtplib
import re
import glob
import subprocess
import time
import json
import requests

for f in glob.glob("/home/manu/HDSRestScripts/HDSoutput*"):
    os.remove(f)

# Function Definition
def foo(storageDeviceId,model,serialNumber,svpIp,protocol,svpHost,tmServer,tmPort,tmAgent,tmInstance):
    filename = '/home/manu/HDSRestScripts/HDSoutput_%s_%s.json' % (storageDeviceId,svpHost)

    cmd = 'curl -v -H "Accept:application/json" -H "Content-Type:application/json" -u xxx:xxx -X GET http://127.0.0.1:23450/ConfigurationManager/v1/objects/storages/%s/pools -o %s' % (storageDeviceId,filename)
    os.system(cmd)

    with open(filename) as json_file:
      for line in json_file:
          pootdata = json.loads(filename) # Load JSON to a variable
          print(pooldata)
          for items in pooldata['data']:
              print(items['poolId'],['poolName'])


# Function call Starts
with open('/home/manu/HDSRestScripts/storageDeviceId.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        foo(row['storageDeviceId'], row['model'], row['serialNumber'],row['svpIp'], row['protocol'], row['svpHost'], row['tmServer'], ['tmPort'], row['tmAgent'], row['tmInstance'])

#Json file:

{
  "data" : [ {
    "poolId" : 21,
    "poolStatus" : "POLN",
    "usedCapacityRate" : 29,
    "poolName" : "Non Perimeter",
    "availableVolumeCapacity" : 665909958,
    "totalPoolCapacity" : 944849304,
    "numOfLdevs" : 312,
    "firstLdevId" : 64770,
    "warningThreshold" : 70,
    "depletionThreshold" : 80,
    "virtualVolumeCapacityRate" : 400,
    "isMainframe" : false,
    "isShrinking" : true,
    "locatedVolumeCount" : 348,
    "totalLocatedCapacity" : 2107885878,
    "blockingMode" : "NB",
    "totalReservedCapacity" : 0,
    "reservedVolumeCount" : 0,
    "poolActionMode" : "AUT",
    "tierOperationStatus" : "MON",
    "dat" : "VAL",
    "poolType" : "RT",
    "monitoringMode" : "CM",
    "tiers" : [ {
      "tierNumber" : 1,
      "tierLevelRange" : "00000002",
      "tierDeltaRange" : "00000005",
      "tierUsedCapacity" : 56919156,
      "tierTotalCapacity" : 375807600,
      "tablespaceRate" : 0,
      "performanceRate" : 47,
      "progressOfReplacing" : 100,
      "bufferRate" : 2
    }, {
      "tierNumber" : 2,
      "tierLevelRange" : "00000000",
      "tierDeltaRange" : "00000000",
      "tierUsedCapacity" : 222020232,
      "tierTotalCapacity" : 300147120,
      "tablespaceRate" : 2,
      "performanceRate" : 3,
      "progressOfReplacing" : 100,
      "bufferRate" : 2
    }, {
      "tierNumber" : 3,
      "tierLevelRange" : "00000000",
      "tierDeltaRange" : "00000000",
      "tierUsedCapacity" : 0,
      "tierTotalCapacity" : 268894584,
      "tablespaceRate" : 2,
      "performanceRate" : 0,
      "progressOfReplacing" : 100,
      "bufferRate" : 2
    } ],
    "duplicationNumber" : 0,
    "dataReductionAccelerateCompCapacity" : 41330116310,
    "dataReductionCapacity" : 0,
    "dataReductionBeforeCapacity" : 0,
    "dataReductionAccelerateCompRate" : 7,
    "duplicationRate" : 0,
    "compressionRate" : 7,
    "dataReductionRate" : 0
  } ]
}

【问题讨论】:

  • 您确定filename 中有内容吗?尝试打印它。如果我没有收到任何数据,或者收到错误,我会收到此错误。

标签: python json rest


【解决方案1】:

您读取 JSON 文件的代码不正确。您似乎对如何使用json.load()json.loads() 感到困惑。前者从文件中读取 JSON 数据。后者从字符串中读取它。它们都没有将文件名作为参数。

试试这个:

#UNTESTED
with open(filename) as json_file:
    pooldata = json.load(json_file)
print(pooldata)
for items in pooldata['data']:
    print(items['poolId'], items['poolName'])

【讨论】:

  • 那行得通。我意识到我在那里犯了一个错误。非常感谢 !但是,当我尝试打印时,“pooldata”会出现一个“u”。 {u'data': [{u'blockingMode': u'NB', u'poolName': u'Non Perimeter', u'dataReductionRate': 0, u'duplicationNumber': 0, u'firstLdevId': 64770, u'dataReductionAccelerateCompRate':7,u'dataReductionAccelerateCompCapacity':41182619541,u'poolActionMode':u'AUT',u'availableVolumeCapacity':665891394,u'isShrinking':假,u'duplicationRate':0,u'compressionRate': 7、u'totalPoolCapacity':944849304....
  • 打印输出(items['poolId'], items['poolName']) 是 (21, u'Non Perimeter')
  • 看起来像'u'出现的字符串值..这正常吗?
  • 没关系。我想通了
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
相关资源
最近更新 更多