【问题标题】:python api response to json objectpython api对json对象的响应
【发布时间】:2020-11-27 02:04:26
【问题描述】:

我正在尝试编写一个脚本来使用 jq 解析 api 响应。我可以使用 bash 和 cli 让它工作,但我想用 python 编写脚本,这样我就可以在其中加入更多逻辑。我遇到的问题是我可以获得 api 响应,但是当我尝试使用 json.loads() 或 json.dump() 加载它时,我不断收到以下错误:

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

这是我从 api 得到的响应

APIResponse({
    "data": {
        "color": "red",
        "comments": "",
        "domain": {
            "domain-type": "domain",
            "name": "SMC User",
            "uid": "41e821a0-3720-11e3-aa6e-0900211d9fde"
        },
        "groups": [
            {
                "domain": {
                    "domain-type": "domain",
                    "name": "SMC User",
                    "uid": "41e821a0-3720-11e3-aa6e-0800211d9fde"
                },
                "name": "NET_MGMT",
                "type": "group",
                "uid": "c0516cd9-d2a7-48a0-967e-5f455b9b0980"
            }
            
        ],
        "icon": "General/group",
        "members": [
            {
                "domain": {
                    "domain-type": "domain",
                    "name": "SMC User",
                    "uid": "41e821a0-3720-11e3-ba6e-0800200c8fde"
                },
                "ipv4-address": "10.10.10.63",
                "name": "WS3",
                "type": "host",
                "uid": "f7e298dc-9817-4786-8ce0-c6f7dd607034"
            },
            {
                "domain": {
                    "domain-type": "domain",
                    "name": "SMC User",
                    "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
                },
                "ipv4-address": "10.10.10.62",
                "name": "WS2",
                "type": "host",
                "uid": "665163a1-319d-48c9-aa25-e7beecfa3456"
            },
            {
                "domain": {
                    "domain-type": "domain",
                    "name": "SMC User",
                    "uid": "41e821a0-3720-11e3-aa6e-1900200c9fde"
                },
                "ipv4-address": "10.10.10.58",
                "name": "host_01",
                "type": "host",
                "uid": "73eded3f-9dee-49d5-84c8-4c9e03b36766"
            }
            
        ],
        "meta-info": {
            "creation-time": {
                "iso-8601": "2017-04-23T16:31-0400",
                "posix": 1492979419853
            },
            "creator": "System",
            "last-modifier": "test123",
            "last-modify-time": {
                "iso-8601": "2020-10-07T13:24-0500",
                "posix": 1602091445514
            },
            "lock": "unlocked",
            "validation-state": "ok"
        },
        "name": "NetworkMgmt",
        "read-only": false,
        "tags": [],
        "type": "group",
        "uid": "254434c7-01a3-4f1d-96b9-b14fc90d9449"
    },
    "res_obj": {
        "data": {
            "color": "red",
            "comments": "",
            "domain": {
                "domain-type": "domain",
                "name": "SMC User",
                "uid": "41e821a0-3620-11e3-aa6e-0800200c8cde"
            },
            "groups": [
                {
                    "domain": {
                        "domain-type": "domain",
                        "name": "SMC User",
                        "uid": "41e821a0-3720-11e3-aa6e-1900200c8ffa"
                    },
                    "name": "NET_MGMT",
                    "type": "group",
                    "uid": "c0516cd9-d2a7-48a0-967e-5f466b9b0986"
                },
                {
                    "domain": {
                        "domain-type": "domain",
                        "name": "SMC User",
                        "uid": "41e821a0-3720-11e3-aa6e-1800200d7fde"
                    },
                    "name": "NET_MGMT",
                    "type": "group",
                    "uid": "0861a249-716d-4590-9091-774b6400ab36"
                }
            ],
            "icon": "General/group",
            "members": [
                {
                    "domain": {
                        "domain-type": "domain",
                        "name": "SMC User",
                        "uid": "41e821a0-3720-11e3-aa6e-0800200d8fde"
                    },
                    "ipv4-address": "10.10.10.63",
                    "name": "WS1",
                    "type": "host",
                    "uid": "f7e298dc-9817-4786-8ce0-c6f7dd607034"
                }
                {
                    "domain": {
                        "domain-type": "domain",
                        "name": "SMC User",
                        "uid": "41e821a0-3720-21e3-aa6e-1800200c91de"
                    },
                    "mask-length4": 28,
                    "name": "Net1",
                    "subnet-mask": "255.255.255.0",
                    "subnet4": "10.10.10.0",
                    "type": "network",
                    "uid": "6a1b1187-01d7-430e-b7dc-321efcf49220"
                }
            ],
            "meta-info": {
                "creation-time": {
                    "iso-8601": "2017-04-23T16:40-0400",
                    "posix": 1492979419853
                },
                "creator": "System",
                "last-modifier": "test123",
                "last-modify-time": {
                    "iso-8601": "2020-10-07T13:24-0400",
                    "posix": 1602091445514
                },
                "lock": "unlocked",
                "validation-state": "ok"
            },
            "name": "NetworkMgmt",
            "read-only": false,
            "tags": [],
            "type": "group",
            "uid": "254434c7-01a3-4f1d-96c8-b14f290d9440"
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})

【问题讨论】:

  • 不完全是json,而是jsonp。您需要剥离回调函数调用以使其成为有效的 json。

标签: python json jq


【解决方案1】:

您的问题是 API 响应不是 JSON;它看起来像一个 javascript 调用。

也许 API 有一个参数,您可以使用它来坚持响应是有效的 JSON。否则,您可能会发现去掉前导 APIResponse( 和尾随 ) 是最简单的方法,但应注意发布的响应参数不是完全有效的 JSON ....

【讨论】:

    【解决方案2】:

    api 正在返回一个对象,而不是预期的 JSON。您也许可以修改您的请求,但无论如何您都可以提取 json 对象。举个例子,我为我点击的一个股票 api 这样做。

    a = api.get_asset('NFLX')
    

    这会返回:

    Asset({   'class': 'us_equity',
        'easy_to_borrow': True,
        'exchange': 'NASDAQ',
        'id': 'bb2a26c0-4c77-4801-8afc-82e8142ac7b8',
        'marginable': True,
        'name': 'Netflix, Inc. Common Stock',
        'shortable': True,
        'status': 'active',
        'symbol': 'NFLX',
        'tradable': True})
    

    要检索元素,我使用以下方法:

    getattr(a, 'symbol')  or  a.symbol
    

    如果你执行 dir(a),你会看到:

    In [21]: dir(a)
    Out[21]:
    ['__class__',
     '__delattr__',
     '__dict__',
     '__dir__',
     '__doc__',
     '__eq__',
     '__format__',
     '__ge__',
     '__getattr__',
     '__getattribute__',
     '__gt__',
     '__hash__',
     '__init__',
     '__init_subclass__',
     '__le__',
     '__lt__',
     '__module__',
     '__ne__',
     '__new__',
     '__reduce__',
     '__reduce_ex__',
     '__repr__',
     '__setattr__',
     '__sizeof__',
     '__str__',
     '__subclasshook__',
     '__weakref__',
     '_raw']
    

    a._raw 输出如下:

    In [23]: a._raw
    Out[23]:
    {'id': 'bb2a26c0-4c77-4801-8afc-82e8142ac7b8',
     'class': 'us_equity',
     'exchange': 'NASDAQ',
     'symbol': 'NFLX',
     'name': 'Netflix, Inc. Common Stock',
     'status': 'active',
     'tradable': True,
     'marginable': True,
     'shortable': True,
     'easy_to_borrow': True}
    

    您可以通过这种方式获取 JSON:

    In [25]: a.__dict__
    Out[25]:
    {'_raw': {'id': 'bb2a26c0-4c77-4801-8afc-82e8142ac7b8',
      'class': 'us_equity',
      'exchange': 'NASDAQ',
      'symbol': 'NFLX',
      'name': 'Netflix, Inc. Common Stock',
      'status': 'active',
      'tradable': True,
      'marginable': True,
      'shortable': True,
      'easy_to_borrow': True}}
    

    还有,

    In [26]: a.__class__
    Out[26]: alpaca_trade_api.entity.Asset
    

    根据您想要做什么,您可以调用这些方法中的任何一个来获取 json 并直接使用它。

    【讨论】:

    • 请提供解释。
    • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多