【问题标题】:Python API first tryPython API 第一次尝试
【发布时间】:2021-03-21 07:46:41
【问题描述】:

我从 API 和 Python 开始。下面的代码可以正常工作。

import requests
import json

def jprint(obj):
    # create a formatted string of the Python JSON object
    text = json.dumps(obj, sort_keys=True, indent=4)
    print(text)

response = requests.get("http://api.open-notify.org/astros.json")
print(response.status_code)
print(response.json())
print()
jprint(response.json())

但是当我尝试做一些更可重用的事情以供以后使用时,我错过了一些东西......如何解决错误?

raise TypeError(f'Object of type {o.class.name} ' TypeError:DataFeed 类型的对象不是 JSON 可序列化的

感谢您的帮助。

import requests
import json

"""Open APIs From Space: https://www.dataquest.io/blog/python-api-tutorial/
"""

class DataFeed:

    base_url = "http://api.open-notify.org/"
    number_of_people_in_space = "astros.json"

    def __init__(self):
        pass

    def _build_url(self):
        url = f"{self.base_url}" \
              f"{self.number_of_people_in_space}"
        return url

    def get(self, url):
        response = requests.get(url)
        content = response.json()
        print(url)
        print(response.status_code)
        print(response.json())

    def get_data_feed(self):
        url = self._build_url()
        self.get(url)

    def jprint(obj):
        # create a formatted string of the Python JSON object
        text = json.dumps(obj, sort_keys=True, indent=4)
        print(text)

message = DataFeed()
message.get_data_feed()
message.jprint()

【问题讨论】:

    标签: python json python-3.x api


    【解决方案1】:

    不要忘记传递给类方法的任何第一个参数总是引用自身self

    所以当你将obj, 传递给 json.dumps(obj, ...) 时,它会将DataFeed 的实例传递给json.dumps 函数。你想要的是通过response.json()

    class DataFeed:
    
        base_url = "http://api.open-notify.org/"
        number_of_people_in_space = "astros.json"
    
        def __init__(self):
            pass
    
        def _build_url(self):
            url = f"{self.base_url}" \
                  f"{self.number_of_people_in_space}"
            return url
    
        def get(self, url):
            response = requests.get(url)
            self.content = response.json()  #changes made here
            print(url)
            print(response.status_code)
            print(response.json())
    
        def get_data_feed(self):
            url = self._build_url()
            self.get(url)
    
        def jprint(self): #changes made here
    
            # create a formatted string of the Python JSON object
            text = json.dumps(self.content, sort_keys=True, indent=4) #changes made here
            print(text)
    
    message = DataFeed()
    message.get_data_feed()
    message.jprint()
    

    【讨论】:

    • 这样工作,谢谢。一个问题。实例属性内容在 init 之外定义。这是个问题吗?是违反一些规则还是这样使用它是正常的?
    • @Marwek77 是的,这是个问题。当您在 get() 方法之前调用 jprint() 时,您会得到 content 属性未定义。为了安全起见,您可以在 init 中实例化 self.content = None
    猜你喜欢
    • 2013-09-21
    • 2013-07-01
    • 2013-10-07
    • 2020-07-13
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    相关资源
    最近更新 更多