当前位置: 首页 > 面试题库 >

无法使用python读取json文件。获取类型错误:json对象为“ TextIOWrapper”

衡安晏
2023-03-14
问题内容

我正在尝试从json文件读取。

这是我创建文件的方式:

import requests
import json
import time
from pprint import pprint

BASE_URL = "https://www.wikiart.org/en/api/2/UpdatedArtists"
artist_json_data = requests.get(BASE_URL).json()

with open('artistdata.json', 'w') as outfile:
    while artist_json_data['hasMore']:
        print(artist_json_data['paginationToken'])
        url = BASE_URL + "?paginationToken=" +artist_json_data['paginationToken']
        artist_json_data = requests.get(url).json()
        json.dump(artist_json_data, outfile, indent=4)
        time.sleep(1)

这是我输出的开始:

{
    "data": [
        {
            "id": "57726da5edc2cb3880b4ca54",
            "artistName": "Paul Feeley",
            "url": "paul-feeley",
            "lastNameFirst": "Feeley Paul",
            "birthDay": "/Date(-1893456000000)/",
            "deathDay": "/Date(-126230400000)/",

当我尝试使用以下代码读取同一文件时:

from pprint import pprint

with open('artistdata.json', 'r', encoding='utf-8') as data_file:    
    data = json.loads(data_file)
    pprint(data)

我得到错误

TypeError: the JSON object must be str, bytes or bytearray, not 'TextIOWrapper'

我不明白,因为我可以像往常一样崇高地打开文件。我该如何处理?

使用以下代码解决了该问题:

问题是我混合了转储和负载。现在我正在使用转储和加载

class Wikiart:
    '''Class to access wikiart.org Data'''
    def __init__(self):
        self.BASE_URL = "https://www.wikiart.org/en/"
        self.BASE_URL_API = self.BASE_URL + "api/2/"
        self.BASE_URL_MOVEMENT = self.BASE_URL + 'artists-by-art-movement/'
        self.ARTIST_DATA_URL = self.BASE_URL_API + "UpdatedArtists"

    def write_artist_data_into_json_file(self):
            artists = requests.get(ARTIST_DATA_URL).json()
            all_artists = artists['data']

            with open('artistdata.json', 'w') as outfile:
                while artists['hasMore']:
                    print('fetching next: pagination token',artists['paginationToken'])
                    url = BASE_URL + "?paginationToken=" + artists['paginationToken']
                    artists_next_page = requests.get(url).json()
                    next_artists = artists_next_page['data']
                    time.sleep(0.25)
                    all_artists = all_artists + next_artists
                    artists = artists_next_page
                json.dump(all_artists, outfile, indent=4)

from pprint import pprint

with open('artistdata.json', 'r', encoding='utf-8') as data_file:    
    data = json.load(data_file)
    pprint(data)

问题答案:

json.load()用于加载文件。json.loads()与字符串一起使用。



 类似资料:
  • 我正在试着得到这一片内数组中的项数 JSON 在不指定编码的情况下,将是一个缓冲区,而不是字符串(感谢用户nils)。json.parse应该对两者都起作用。现在我得到一个错误处。知道怎么解决吗?(使用节点5.2.0)

  • 问题内容: 我有一个HTTP API,无论成功还是失败,它都会返回JSON数据。 失败示例如下所示: 我想要在JavaScript代码中实现的是这样的: 问题答案: fulfilled return Promise.reject(resp.json()); 好吧,诺言 将 得到兑现,只是不等待它,而是立即 兑现诺言 。 我假设您宁愿执行以下操作: (或明确写出)

  • 问题内容: 我正在寻找一个JSON分析器,该分析器可以让我从大型JSON文件(大小为几百MB)中遍历JSON对象。我从Json.NET尝试了JsonTextReader,如下所示: 但是它在令牌之后返回令牌。 如果我需要整个对象而不是令牌,有没有更简单的方法? 问题答案: 假设您有一个与此类似的json数组: 我将为对象类型声明一个类 现在,反序列化部分 还有一个伪JsonConverter类来拦

  • 嗨,我在node.js中得到了以下代码 我试图以以下json格式显示键和所有的值:

  • 问题内容: 我正在尝试从JSON文件读取值到数组以进行进一步处理。我正在使用JSON-Smart 1.2.0库。由于某些限制,我不能使用2.0版本。 我收到以下异常。 我什至尝试使用JSONArray而不是JSONObject。我在这儿做错了什么?这是读取JSON内容的正确方法吗? 以下是Java代码。 以下是json文件的内容。 问题答案: 您的JSON包含一个具有单个对象元素的数组,因此您应该

  • 问题内容: 我正在尝试使用该模块从python脚本读取json文件。经过一番谷歌搜索后,我发现以下代码: json文件的路径和名称在哪里。我收到以下错误: 问题答案: 该代码用作变量名。它将阴影您导入的模块引用。为变量使用其他名称。 除此之外,代码在接受字符串的同时传递文件对象。 传递文件内容: 或使用接受类似文件的对象。