Python:如何从 JSON 数组中获取索引?

问题描述 投票:0回答:2

所以,我能够回答我之前关于如何从 JSON 数组中获取 JSON 的值的问题。但现在我正在尝试用 Python 转换它(用于硒)。

这是 JSON 数组:

[
    {
        "id": 3328367679,
        "inbox_id": 35584,
        "subject": "Open this message"
    },
    {
        "id": 3328364404,
        "inbox_id": 35584,
        "subject": "Another message"
    },
    {
        "id": 3328363502,
        "inbox_id": 35584,
        "subject": "Open this message"
    },
    {
        "id": 3328357254,
        "inbox_id": 35584,
        "subject": "Open this message"
    },
    {
      "id": 3328349654,
      "inbox_id": 35584,
      "subject": "Open this message"
    }
  ]

下面是我的脚本,它在 Cypress Javascript 中运行。这是通过获取 JSON 的索引来实现的,该索引给出第一个相同的

"subject"
"Open this message"
然后使用相同的索引返回
"id"
3328367679

function getMessageID() {
        cy.request({
            url: Cypress.env('url'),
            method: 'GET',
            headers: {
                'Api-Token': Cypress.env('token'),
                'Content-Type': 'application/json;charset=utf-8'
            },
        })
        .then((response) => {
            expect(response.status).to.eq(200)
            var messages = response.body
            var messageTitle = 'Open this message'
            for (var i = 0; i < messages.length; i++){
                if (messages[i].subject == messageTitle){
                    return messages[i].id
                    break;
                    }
            }
        })
    }
    getMessageID()

如何在 Python 中转换它?这是我当前的脚本,当我打印它时,它给了我

None
的价值。我在功能文件中运行
get_id
,因为它们已连接:

def get_messages():
    url = "https://uri.io/api/accounts/fdsdfs/inboxes/dfsfds/messages/"
    headers = {
        "Content-Type": "application/json;charset=utf-8",
        "Api-Token": "123345dsfgsdrgf3456dfg5634dfv5"
    }
    response = requests.get(url=url, headers=headers)
    return response.json()

@staticmethod
def get_id():
    messages = ClassName.get_messages()
    message_title = "Open this message"
    for item in messages:
        if item["subject"] == message_title:
            print("Message id is " + item["id"])
            return item["id"]
        break

也尝试在

for loop
中使用
for loop

def get_id():
    messages = ClassName.get_messages()
    message_title = "Open this message"
    for json_item in messages:
        for message_item in json_item:
            if message_item["subject"] == message_title:
                print("Message id is " + str(message_item["id"]))
            return message_item["id"]
        break

我能够使用此代码打印

subject
。我如何在 Python 中使用索引?
print(messages[0]["subject"])

    @staticmethod
def get_id():
    messages = ClassName.get_messages()
    message_title = "Open this message"
    # print(messages)
    print(messages[0]["subject"])
    # for item in messages:
    #     if messages[item]["subject"] == message_title:
    #         print("Message id is " + messages[item]["id"])
    #         return messages[item]["id"]
    #     break
python json for-loop selenium-webdriver python-requests
2个回答
1
投票

你所拥有的问题是连接部分。你不能将一个字符串连接到一个 int 所以在你的循环中你应该将 id 转换为字符串:

message_title = "Open this message"
for item in messages:
    if item["subject"] == message_title:
        print("Message id is " + str(item["id"]))
        return item["id"]
    break

除此之外,如果响应与您在示例顶部发布的响应相同,则不需要

return response.json()
,您可以直接使用它
return response

经过这些调整后,您最终解析的代码工作正常。

如果这不能解决您的问题,请在

messages
函数中打印
get_id
变量并更新您的问题,因为错误出在 api 调用或格式化响应中,而不是在解析它时。


-1
投票

非常感谢@pr1nc3 帮助我!由于返回

None
,因此在变量中分配 JSON 值时出现问题。不知道为什么我们有
None
但我重构了代码并将其合并为 1(感谢这个策略 @pr1nc3 :))。

这是工作代码

def get_id():
    url = "https://uri.io/api/accounts/fdsdfs/inboxes/dfsfds/messages/"
    headers = {
        "Content-Type": "application/json;charset=utf-8",
        "Api-Token": "123345dsfgsdrgf3456dfg5634dfv5"
    }
    messages = requests.get(url=url, headers=headers).json()
    message_title = "Open this message"
    for item in messages:
        if item["subject"] == message_title:
            return item["id"]
        break
© www.soinside.com 2019 - 2024. All rights reserved.