读取复杂的JSON以提取键值



我有一个JSON,我正在尝试读取其中的一部分以提取键和值。假设响应是我的JSON数据,下面是我的代码:

data_dump = json.dumps(response) 
data = json.loads(data_dump)

在这里,我的数据对象变成了一个列表,我正试图获得下面的密钥

id = [key for key in data.keys()]

此操作失败,错误为:

列表对象没有属性键**。我如何才能克服这一点,获得低于预期的输出?

这是我的JSON:

{
"1": {
"task": [
"wakeup",
"getready"
]
},
"2": {
"task": [
"brush",
"shower"
]
},
"3": {
"task": [
"brush",
"shower"
]
},
"activites": ["standup", "play", "sitdown"],
"statuscheck": {
"time": 60,
"color": 1002,
"change(me)": 9898
},
"action": ["1", "2", "3", "4"]
}

我需要的输出如下。我不需要来自JSON其余部分的数据。

id任务
1唤醒,准备好
2刷子,淋浴

如果您知道您需要的密钥是"1〃;以及";2〃;,您可以尝试将JSON字符串作为数据帧读取、取消对其进行分解和分组:

from pyspark.sql import functions as F
df = (spark.read.json(sc.parallelize([data_dump]))
.selectExpr("stack(2, '1', `1`, '2', `2`) (id, task)")
.withColumn('task', F.explode('task.task'))
.groupBy('id').agg(F.collect_list('task').alias('task'))
)
df.show()
# +---+------------------+
# | id|              task|
# +---+------------------+
# |  1|[wakeup, getready]|
# |  2|   [brush, shower]|
# +---+------------------+

然而,在Python中处理它可能更容易:

data = json.loads(data_dump)
data2 = [(k, v['task']) for k, v in data.items() if k in ['1', '2']]
df = spark.createDataFrame(data2, ['id', 'task'])
df.show()
# +---+------------------+
# | id|              task|
# +---+------------------+
# |  1|[wakeup, getready]|
# |  2|   [brush, shower]|
# +---+------------------+

最新更新