我需要从嵌套在 JSON 对象中的名为 token 的字段中解析或提取字符串,以便替换会话令牌的电子邮件和密码

Posted

技术标签:

【中文标题】我需要从嵌套在 JSON 对象中的名为 token 的字段中解析或提取字符串,以便替换会话令牌的电子邮件和密码【英文标题】:I need to parse or extract a string from a field called token nested in a JSON object in order to replace email and password for a session token 【发布时间】:2020-07-12 05:58:05 【问题描述】:

我正在尝试创建一个会话身份验证令牌,在用户输入他们的电子邮件和密码后,该令牌可用于后续的 api 调用。

使用下面显示的第一段代码,我收到了正确的电子邮件和密码的 200 响应,但我收到了一个错误,因为我无法从下面共享的第二段代码中获取“令牌”。 ..

const options = 
  url: 'https://api.knack.com/v1/applications/5e159b77ed2cc100162fae1f/session',
  method: 'POST',
  headers: 
    'content-type': 'application/json',
    'Knack-Application-Id': '5e159b77ed2cc100162fae1f',
    'email': bundle.authData.email,
    'password': bundle.authData.password
  ,
  params: 
     'email': bundle.authData.email,
    'password': bundle.authData.password

  ,
  body: 
    'email': bundle.authData.email,
    'password': bundle.authData.password

  


return z.request(options)
  .then((response) => 
    response.throwForStatus();
    const results = z.JSON.parse(response.content.token);
    //const token = z.JSON.parse(reponse.content.token)
   // const token=

    // You can do any parsing you need for results here before returning them

    return 
      'sessionKey': results.token
    ;
  );

上面的响应成功验证了 200 响应,并提供了一个 JSON 对象,其中包含用户个人资料信息和我需要接受的令牌。我无法从 JSON 响应中获取必要的字符串(因为我是菜鸟),如下所示:

// Data returned by remote login request

  "session": 
    "user": 
      "approval_status": "approved",
      "empty_pass": false,
      "id": "user_id",
      "profile_keys": [
        "profile_4"
      ],
      "profile_objects": [
        
          "entry_id": "entry_id",
          "object": "object_4"
        
      ],
      "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiNTUzMWExNmI2YTEzMTk1ZTcyNmUxZTBmIiwiYXBwbGljYXYpb25faWQiOiI1NTIzMTM5ZjNiY2U2NDdhMDJiZDUxNTAiLCJpYXQiOjE0Mjk3MTgzNzl9.K-WULiJxT-st8vxnTkqxCtp2nv5ykrSToPQsTRx6r1I",
      "utility_key": "key",
      "values": 
    
  

我需要从“token”字段中获取字符串。

如果可以,请给我指路?

【问题讨论】:

【参考方案1】:

感谢您发布response 变量的内容!如果那是您要返回的对象,您应该能够使用以下代码访问 token 字段:

const response = 
  "session": 
    "user": 
      "approval_status": "approved",
      "empty_pass": false,
      "id": "user_id",
      "profile_keys": [
        "profile_4"
      ],
      "profile_objects": [
        
          "entry_id": "entry_id",
          "object": "object_4"
        
      ],
      "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiNTUzMWExNmI2YTEzMTk1ZTcyNmUxZTBmIiwiYXBwbGljYXYpb25faWQiOiI1NTIzMTM5ZjNiY2U2NDdhMDJiZDUxNTAiLCJpYXQiOjE0Mjk3MTgzNzl9.K-WULiJxT-st8vxnTkqxCtp2nv5ykrSToPQsTRx6r1I",
      "utility_key": "key",
      "values": 
    
  


console.log(response.session.user.token);
eyJ0eXAiOiJK...

您可以使用 . 来引用 javascript 对象使用的键。所以如果你的变量是response,你可以使用response.session获取其中的session对象,也可以使用response.session.user获取session内部的user对象。

但是,首先,您可能希望将 then 块的内容更改为:

    response.throwForStatus();
    const results = z.JSON.parse(response);

    return 
      'sessionKey': results.session.user.token
    ;

z.JSON.parse 函数会将响应数据转换为 JavaScript 可以原生使用的数据。如果response 具有上面引用的格式,则可以使用该点表示法来获取每个内部对象。你的第一个例子是传递response.content.token,它似乎不存在。尝试改用response,看看是否能让你更接近。

此页面可能会为您提供更多上下文,以帮助您梳理该响应对象中的一些字段:https://www.w3schools.com/js/js_json_objects.asp

祝你好运!

【讨论】:

您好,感谢您的回复!我尝试使用“console.log(response.session.user.token);”它说响应未定义。我还在 Zapier 上使用用例进行了尝试,它说: Received content ""session":"user":"id":"5e159b7a6e933c7c6139454c","values":"field_7":["profile_4", "profile_5","pr" 无法读取未定义控制台日志的属性“用户”: 糟糕,感谢您的澄清!我已经编辑了上面的答案以提供更多上下文。尝试将z.JSON.parse(response.content.token) 替换为z.JSON.parse(response),将'sessionKey': results.token 替换为'sessionKey': results.session.user.token,看看是否可行。 再次感谢,我得到初始身份验证的响应 200 现在我抛出了一个新错误:"id":"5e159b7a6e933c7c6139454c","values":"field_7":["profile_4" ,"profile_5","pr" 解析响应时出错。 “[object Object]”不是字符串。控制台日志: 如果它在相同的代码中崩溃,我最好的猜测是你实际上不需要使用z.JSON.parse。您可以尝试省略const results = z.JSON.parse(response); 的行并将'sessionKey': results.session.user.token 更改为'sessionKey': response.session.user.token

以上是关于我需要从嵌套在 JSON 对象中的名为 token 的字段中解析或提取字符串,以便替换会话令牌的电子邮件和密码的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何遍历 html 中的嵌套 Json 对象

如何使用从 Flutter 中的 json 解析的嵌套映射列表中的函数创建对象

Azure 数据流:从 JSON 字符串解析对象的嵌套列表

如何使用 c# 从 ajax 中的嵌套 JSON 对象中获取值

无法从python中的json数组获取嵌套对象

使用python打印嵌套在数组中的json对象