我需要从嵌套在 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 的字段中解析或提取字符串,以便替换会话令牌的电子邮件和密码的主要内容,如果未能解决你的问题,请参考以下文章
如何使用从 Flutter 中的 json 解析的嵌套映射列表中的函数创建对象