我如何开始拆分这块 JSON 数据?
How Do I Start Pulling Apart This Block of JSON Data?
我想制作一个程序,可以离线复制可汗学院的数学问题。我有一个 21.6MB 的巨大文本文件,其中包含他们所有练习的数据,但我不知道如何开始分析它,更不用说从中提取问题了。
Here is a pastebin containing a sample of the JSON data. If you want to see all of it, you can find it here。加载时间过长警告。
我以前从未使用过 JSON,但我编写了一个快速的 Python 脚本来尝试加载单个 "sub-blocks"(或等效的正确术语)数据。
import sys
import json
exercises = open("exercises.txt", "r+b")
byte = 0
frontbracket = 0
backbracket = 0
while byte < 1000: #while byte < character we want to read up to
#keep at 1000 for testing purposes
char = exercises.read(1)
sys.stdout.write(char)
#Here we decide what to do based on what char we have
if str(char) == "{":
frontbracket = byte
while True:
char = exercises.read(1)
if str(char)=="}":
backbracket=byte
break
exercises.seek(frontbracket)
block = exercises.read(backbracket-frontbracket)
print "Block is " + str(backbracket-frontbracket) + " bytes long"
jsonblock = json.loads(block)
sys.stdout.write(block)
print jsonblock["translated_display_name"]
print "\nENDBLOCK\n"
byte = byte + 1
好的,重复的模式似乎是这样的:http://pastebin.com/4nSnLEFZ
要了解响应的结构,您可以使用 JSONlint 到 copy/paste 部分字符串和 'validate'。即使您复制的部分无效,它仍会将其格式化为您实际可以阅读的内容。
首先,我使用 requests
库为您提取了 JSON。当你处理这样的事情时,它是一个超级简单的库。 API 响应缓慢,因为看起来你正在拉动一切,但它应该工作正常。
从 API 获得响应后,您可以使用 .json()
将其直接转换为 python 对象。你所拥有的本质上是嵌套列表和字典的混合体,你可以遍历它们并提取特定的细节。在我下面的示例中,my_list2
必须使用 try/except
结构,因为某些条目似乎在 translated_problem_types
下的列表中没有两个项目。在这种情况下,它只会用 'None' 代替。对于这些事情,您可能需要反复试验。
最后,由于您以前没有使用过 JSON,因此还值得注意的是,它本身可以像字典一样工作;无法保证您收到详细信息的顺序。然而,在这种情况下,最外层结构似乎是一个列表,因此理论上可能存在一致的顺序但不依赖它 - 我们不知道列表是如何构建的。
import requests
api_call = requests.get('https://www.khanacademy.org/api/v1/exercises')
json_response = api_call.json()
# Assume we first want to list "author name" with "author key"
# This should loop through the repeated pattern in the pastebin
# access items as a dictionary
my_list1 = []
for item in json_response:
my_list1.append([item['author_name'], item['author_key']])
print my_list1[0:5]
# Now let's assume we want the 'sha' of the SECOND entry in translated_problem_types
# to also be listed with author name
my_list2 = []
for item in json_response:
try:
the_second_entry = item['translated_problem_types'][0]['items'][1]['sha']
except IndexError:
the_second_entry = 'None'
my_list2.append([item['author_name'], item['author_key'], the_second_entry])
print my_list2[0:5]
我想制作一个程序,可以离线复制可汗学院的数学问题。我有一个 21.6MB 的巨大文本文件,其中包含他们所有练习的数据,但我不知道如何开始分析它,更不用说从中提取问题了。
Here is a pastebin containing a sample of the JSON data. If you want to see all of it, you can find it here。加载时间过长警告。
我以前从未使用过 JSON,但我编写了一个快速的 Python 脚本来尝试加载单个 "sub-blocks"(或等效的正确术语)数据。
import sys
import json
exercises = open("exercises.txt", "r+b")
byte = 0
frontbracket = 0
backbracket = 0
while byte < 1000: #while byte < character we want to read up to
#keep at 1000 for testing purposes
char = exercises.read(1)
sys.stdout.write(char)
#Here we decide what to do based on what char we have
if str(char) == "{":
frontbracket = byte
while True:
char = exercises.read(1)
if str(char)=="}":
backbracket=byte
break
exercises.seek(frontbracket)
block = exercises.read(backbracket-frontbracket)
print "Block is " + str(backbracket-frontbracket) + " bytes long"
jsonblock = json.loads(block)
sys.stdout.write(block)
print jsonblock["translated_display_name"]
print "\nENDBLOCK\n"
byte = byte + 1
好的,重复的模式似乎是这样的:http://pastebin.com/4nSnLEFZ
要了解响应的结构,您可以使用 JSONlint 到 copy/paste 部分字符串和 'validate'。即使您复制的部分无效,它仍会将其格式化为您实际可以阅读的内容。
首先,我使用 requests
库为您提取了 JSON。当你处理这样的事情时,它是一个超级简单的库。 API 响应缓慢,因为看起来你正在拉动一切,但它应该工作正常。
从 API 获得响应后,您可以使用 .json()
将其直接转换为 python 对象。你所拥有的本质上是嵌套列表和字典的混合体,你可以遍历它们并提取特定的细节。在我下面的示例中,my_list2
必须使用 try/except
结构,因为某些条目似乎在 translated_problem_types
下的列表中没有两个项目。在这种情况下,它只会用 'None' 代替。对于这些事情,您可能需要反复试验。
最后,由于您以前没有使用过 JSON,因此还值得注意的是,它本身可以像字典一样工作;无法保证您收到详细信息的顺序。然而,在这种情况下,最外层结构似乎是一个列表,因此理论上可能存在一致的顺序但不依赖它 - 我们不知道列表是如何构建的。
import requests
api_call = requests.get('https://www.khanacademy.org/api/v1/exercises')
json_response = api_call.json()
# Assume we first want to list "author name" with "author key"
# This should loop through the repeated pattern in the pastebin
# access items as a dictionary
my_list1 = []
for item in json_response:
my_list1.append([item['author_name'], item['author_key']])
print my_list1[0:5]
# Now let's assume we want the 'sha' of the SECOND entry in translated_problem_types
# to also be listed with author name
my_list2 = []
for item in json_response:
try:
the_second_entry = item['translated_problem_types'][0]['items'][1]['sha']
except IndexError:
the_second_entry = 'None'
my_list2.append([item['author_name'], item['author_key'], the_second_entry])
print my_list2[0:5]