如何在Python中读取JSON对象

57

我有一个名为 "panamaleaks50k.json" 的json文件。我想从json文件中获取['text']字段,但它显示以下错误

JSON对象必须是str、bytes或bytearray,而不是'TextIOWrapper'

这是我的代码

with open('C:/Users/bilal butt/Desktop/PanamalEakJson.json','r') as lst:
    b = json.loads(lst)
    print(b['text'])

我的JSON文件长这样

[
{
   "fullname": "Mohammad Fayyaz",
   "id": "885800668862263296",
   "likes": "0",
   "replies": "0",
   "retweets": "0",
   "text": "Love of NS has been shown in PanamaLeaks scandal verified by JIT...",
   "timestamp": "2017-07-14T09:58:31",
   "url": "/mohammadfayyaz/status/885800668862263296",
   "user": "mohammadfayyaz"
 },
{
  "fullname": "TeamPakistanPTI \u00ae",
  "id": "885800910357749761",
  "likes": "0",
  "replies": "0",
  "retweets": "0",
  "text": "RT ArsalanISF: #PanamaLeaks is just a start. U won't believe whr...",
  "timestamp": "2017-07-14T09:59:29",
  "url": "/PtiTeampakistan/status/885800910357749761",
  "user": "PtiTeampakistan"
 }
]

我该如何读取所有的 ['text'] 和单个的 ['text'] 字段?

json.load(open('C:/Users/bilal butt/Desktop/PanamalEakJson.json'))['text'] json.load(open('C:/Users/bilal butt/Desktop/PanamalEakJson.json'))['text'] - Doracahl
2个回答

138

你应该将文件内容 (即一个字符串)传递给json.loads(),而不是文件对象本身。请尝试以下操作:

with open(file_path) as f:
    data = json.loads(f.read())
    print(data[0]['text'])

还有一个json.load()函数,该函数接受一个文件对象,并在幕后为您执行f.read()部分。


5
有趣的是,一个字母's'可以产生很大的区别。在我看来,这两个函数方法的命名应该更加明显地区分开来。 - programmer dreamer
3
@程序员梦想家,“s”表示解析字符串。 - Moha369
太好了,这对我很有帮助。 - Ankit Chawla

23

如果您的输入是类文件对象(例如TextIOWrapper),请使用json.load()而不是json.loads()

考虑以下完整的复现代码:

import json, tempfile
with tempfile.NamedTemporaryFile() as f:
    f.write(b'{"text": "success"}'); f.flush()
    with open(f.name,'r') as lst:
        b = json.load(lst)
        print(b['text'])

...输出结果为success


标记为社区维基以避免从已知的重复问题中收集声望。人们应该随意编辑/修改,但链接的答案应被视为更加权威。 - Charles Duffy
1
我在使用 load() 函数时遇到了这个错误:JSON 对象必须是 str、bytes 或 bytearray,而不是 'TextIOWrapper' - Bilal Butt
@BilalButt,load()不会产生那个错误--与问题中使用的loads()不同,load()接受类似文件的对象作为输入。如果您断言它可以,请编辑您的问题以添加一个[mcve]--其他人可以运行的最短代码,而无需修改即可看到问题本身。(现在缩进是错误的,除了您之外没有人拥有C:\Users\bilal butt目录,因此这不是其他人可以调用的代码)。 - Charles Duffy
感谢您的快速回复。我在我的问题中编辑了JSON文件。 - Bilal Butt
文件的内容并不相关 -- 文件只需要包含 [],错误也是一样的。因此,最小化的重现器不需要包含比解析的文件内容更多(但如果无法在没有文件的情况下重现,它应该实际上创建一个具有这些内容的文件)。 - Charles Duffy
@BilalButt,...请查看我对你的问题所做的编辑,使得即使文件事先不存在,也可以复制粘贴代码来产生问题,并查看对答案所做的编辑,以便用复制粘贴式测试进行测试。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接