【问题标题】:Reading key values a JSON array which is a set in Python读取键值 JSON 数组,它是 Python 中的一个集合
【发布时间】:2022-01-18 13:55:28
【问题描述】:

我有以下代码

import requests
import json
import sys

credentials_User=sys.argv[1]
credentials_Password=sys.argv[2]
email=sys.argv[3]

def auth_api(login_User,login_Password,):

    gooddata_user=login_User
    gooddata_password=login_Password
    body = json.dumps({
    "postUserLogin":{
        "login": gooddata_user,
        "password": gooddata_password,
        "remember":1,
        "verify_level":0
    }
    })
    headers = {
    'Content-Type': 'application/json',
    'Accept': 'application/json'
    }

    url="https://reports.domain.com/gdc/account/login"

    response = requests.request(
        "POST",
        url,
        headers=headers,
        data=body
    )
    sst=response.headers.get('Set-Cookie')
    return sst

def query_api(cookie,email):

    url="https://reports.domain.com/gdc/account/domains/domain/users?login="+email
    
    body={}

    headers={
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'Cookie': cookie
    }

    response = requests.request(
        "GET",
        url,
        headers=headers,
        data=body
    )
    jsonContent=[]
    jsonContent.append({response.text})
    accountSettings=jsonContent[0]
    print(accountSettings)


cookie=auth_api(credentials_User,credentials_Password)
profilehash=query_api(cookie,email)

代码本身工作并向 Gooddata API 发送请求。

query_api() 函数返回类似于下面的 JSON

{
  "accountSettings": {
    "items": [
      {
        "accountSetting": {
          "login": "user@example.com",
          "email": "user@example.com",
          "firstName": "First Name",
          "lastName": "Last Name",
          "companyName": "Company Name",
          "position": "Data Analyst",
          "created": "2020-01-08 15:44:23",
          "updated": "2020-01-08 15:44:23",
          "timezone": null,
          "country": "United States",
          "phoneNumber": "(425) 555-1111",
          "old_password": "secret$123",
          "password": "secret$234",
          "verifyPassword": "secret$234",
          "authenticationModes": [
            "SSO"
          ],
          "ssoProvider": "sso-domain.com",
          "language": "en-US",
          "ipWhitelist": [
            "127.0.0.1"
          ],
          "links": {
            "projects": "/gdc/account/profile/{profile_id}/projects",
            "self": "/gdc/account/profile/{profile_id}",
            "domain": "/gdc/domains/default",
            "auditEvents": "/gdc/account/profile/{profile_id}/auditEvents"
          },
          "effectiveIpWhitelist": "[ 127.0.0.1 ]"
        }
      }
    ],
    "paging": {
      "offset": 20,
      "count": 100,
      "next": "/gdc/uri?offset=100"
    }
  }
}

我遇到的问题是从这个 JSON Dict 中读取特定的键,我可以使用 accountSettings=jsonContent[0] 但这只会返回相同的 JSON。

我想要做的是读取projectlinks 键的值

我将如何使用 dict 执行此操作?

谢谢

【问题讨论】:

  • 这是dict,而不是set。要阅读登录信息,您应该使用jsonContent["accountSettings"]["items"][0]["accountSetting"]["login"]
  • 对我来说,你在做什么并不是很清楚。既不是您的输入,也不是您的代码对它的作用。请提供一个minimal reproducible example,人们可以直接运行。
  • @UlrichEckhardt 反映我确实同意,我现在已经更新了原始问题。谢谢
  • 没有凭据我无法运行它...无论如何,是实际请求还是对结果的处理给您带来了问题?这是您在提取minimal reproducible example时需要解决的一个重要部分!
  • jsonContent.append({response.text}) 实际上并不解析 JSON。您应该改用jsonContent = response.json。之后,您可以像处理来自其他任何地方的结构化数据一样处理结构化数据。

标签: python json variables set


【解决方案1】:

根据您的描述,您在列表中具有您的值,(不是set。关于set 的错误:集合不与JSON 一起使用)。在您的列表中,您可以将您的内容作为单个字符串,然后您必须使用json.loads 对其进行解析,或者它只是一个已经从 JSON 中提取的行为良好的嵌套数据结构,但它位于单个元素列表中。这似乎是最有可能的。

所以,你应该可以做到:

accountlink = jsonContent[0]["items"][0]["accountSetting"]["login"]

否则,如果编码为json字符串,则必须先解析:

import json
accountlink = json.loads(jsonContent[0])["items"][0]["accountSetting"]["login"]

现在,鉴于您的问题,我想说您作为程序员或临时用户处于初学者水平,只是使用 Python 来自动化某些事情,我建议您在继续之前尝试一些练习:它将节省您的时间(很多时间)。我不是想在这里欺负或嘲笑任何事情:这是我能给你的最好建议。寻找互动模式的教程,而不是一次尝试整个程序,然后复制和粘贴。

【讨论】:

  • 感谢您的帮助!是的,我不是一个经验丰富的程序员,我希望尽快改变这一点。我尝试了您的第一个建议,但收到以下错误Traceback (most recent call last): File "/apiauth.py", line 62, in <module> profilehash=query_api(cookie,email) File "apiauth.py", line 57, in query_api accountlink = jsonContent[0]["items"][0]["accountSetting"]["login"] TypeError: 'set' object is not subscriptable
  • 第二条建议也给了我一个错误Traceback (most recent call last): File "apiauth.py", line 62, in <module> profilehash=query_api(cookie,email) File "apiauth.py", line 57, in query_api accountlink = json.loads(jsonContent[0])["items"][0]["accountSetting"]["login"] File "/opt/homebrew/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/__init__.py", line 339, in loads raise TypeError(f'the JSON object must be str, bytes or bytearray, ' TypeError: the JSON object must be str, bytes or bytearray, not set
  • 好吧,你确实得到了一个“集合”——这不应该发生在简单的 json 读取中。首先将集合转换为“列表”。这应该有效,除非“集合”是内部元素之一:accountlink = list(jsonContent) [0]["items"][0]["accountSetting"]["login"] 从您的帖子中,该集合可能是内部元素之一,此时它是真正的;如果您知道自己在做什么,这将有所帮助,但请尝试最后一枪:accountlink = list(jsonContent [0]["items"])[0]["accountSetting"]["login"]
  • 感谢您的帮助,很遗憾没有奏效,但我会做一些练习来计算出不同的数据类型。谢谢
【解决方案2】:

使用下面的代码解决了这个问题

jsonContent=json.loads(response.text)
print(type(jsonContent))
test=jsonContent["accountSettings"]["items"][0]
test2=test["accountSetting"]["links"]["self"]
print(test)
print(test2)

我相信这是可行的,因为出于某种原因,我没有注意到我将 .append 用于我的 jsonContent。这导致数据类型与应有的不同。

感谢所有尝试帮助我的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2021-09-30
    • 2014-07-29
    相关资源
    最近更新 更多