使用Python解析JSON - 如何访问深层元素

时间:2017-03-15 06:06:39

标签: python json

您好我是JSON和Python的新手,这是我的困境,它已经困扰了我两天。 这是我要解析的示例json。

{
    "Tag1":"{
"TagX": [
  {
    "TagA": "A",
    "TagB": 1.6,
    "TagC": 1.4,
    "TagD": 3.5,
    "TagE": "01",
    "TagF": null
  },
  {
    "TagA": "A",
    "TagB": 1.6,
    "TagC": 1.4,
    "TagD": 3.5,
    "TagE": "02",
    "TagF": null
  }
],  
"date": "10.03.2017 21:00:00"
    }"
}

这是我的python代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import json
import urllib2

jaysonData = json.load(urllib2.urlopen('URL'))
print jaysonData["Tag1"]

如何获取TagB和TagC的值? 当我尝试使用

访问它们时
jaysonData = json.load(urllib2.urlopen('URL'))
print jaysonData["Tag1"]["TagX"]["TagB"]

输出结果为:

TypeError: string indices must be integers

当我这样做时:

print jaysonData["Tag1"]

输出结果为:

{
"TagX": [
  {
    "TagA": "A",
    "TagB": 1.6,
    "TagC": 1.4,
    "TagD": 3.5,
    "TagE": "01",
    "TagF": null
  },
  {
    "TagA": "A",
    "TagB": 1.6,
    "TagC": 1.4,
    "TagD": 3.5,
    "TagE": "02",
    "TagF": null
  }
],  
"date": "10.03.2017 21:00:00"
    }"

我需要访问TagX,TagD,TagE,但下面的代码会出现此错误:

print jaysonData["Tag1"]["TagX"]

打印

    print jaysonData["Tag1"]["TagX"]
TypeError: string indices must be integers

如何使用python访问TagA到TagF? 提前谢谢。

4 个答案:

答案 0 :(得分:1)

在返回的JSON中,Tag1的值是一个字符串,而不是更多的JSON。它看起来似乎是JSON编码为字符串,所以再次转换为json:

jaysonData = json.load(urllib2.urlopen('URL'))
tag1JaysonData = json.load(jaysonData['Tag1'])
print tag1JaysonData["TagX"]

另请注意,TagX是一个列表,而不是字典,因此其中包含多个TagB

print [x['TagB'] for x in tag1JaysonData['TagX']]

答案 1 :(得分:0)

TagXlist,由2个词典组成,TagBdictionary

print jaysonData["Tag1"]["TagX"][0]["TagB"]

您需要在Tag1的大括号之前和之后删除双引号。

{
    "Tag1":{
"TagX": [
  {
    "TagA": "A",
    "TagB": 1.6,
    "TagC": 1.4,
    "TagD": 3.5,
    "TagE": "01",
    "TagF": null
  },
  {
    "TagA": "A",
    "TagB": 1.6,
    "TagC": 1.4,
    "TagD": 3.5,
    "TagE": "02",
    "TagF": null
  }
],  
"date": "10.03.2017 21:00:00"
    }
}

答案 2 :(得分:0)

{
    "Tag1":{
"TagX": [
  {
    "TagA": "A",
    "TagB": 1.6,
    "TagC": 1.4,
    "TagD": 3.5,
    "TagE": "01",
    "TagF": null
  },
  {
    "TagA": "A",
    "TagB": 1.6,
    "TagC": 1.4,
    "TagD": 3.5,
    "TagE": "02",
    "TagF": null
  }
],  
"date": "10.03.2017 21:00:00"
    }
}

你必须在Tag1的大括号之前删除双qoutation。我在上面的示例中删除了。

和这样的接近。

print jaysonData["Tag1"]["TagX"][0]["TagA"]

答案 3 :(得分:0)

您需要考虑您要访问的值,例如字典或列表? 您始终按键访问dict元素,并按索引列出元素。

删除从网址读取数据后可以执行的引号。

import ast
JsonData = ast.literal_eval(jaysonData["Tag1"])
JsonData["Tagx"][0]["TagB"]