在我正在开发的应用程序中,我将一些配置存储在对象文字的备注字段中。
{
JWT : { endpoint :"https://somelink1",
clientid :"consent-management",
grantType :"client_credentials" },
CMP : {endpoint :"https://someotherlink2",
contentType :"application/json"}
}
使用正则表达式和特定于应用程序的 JavaScript 语言,我仅处理对象部分并解析它
var auth = nms.extAccount.load(39010);
var regex = /{([^;]*)}/gm;
var authObj = JSON.parse(JSON.stringify(auth.comment.match(regex)));
logInfo(authObj);
通常我会使用点符号
authObj.JWT.endpoint)
来浏览对象,但它不起作用。
14/05/2024 13:25:47 js JST-310000 Error while compiling script 'WKF9/js' line 6: authObj.JWT is undefined.
只是想知道我是否遗漏了一些东西。
我记录类型并且是对象
14/05/2024 14:24:32 js object
replace
任务将其清理为有效的 JSON 字符串,其中以下正则表达式 ... /\w+(?=\s*:\s*["{])/gm
... 确实匹配每个配置的键。
/\s*\*\*\*.*?\*\*\*\s+/gm
...replace
任务需要先运行,然后才能安全地解析为授权对象。
注意
虽然第一个引入的键匹配正则表达式已经足够了,但另一个正则表达式,如 ...
/(?<=[{,]\s*)\w+(?=\s*:\s*["{])/gm
... 甚至更可靠。这个最近引入的正则表达式不仅像前一个一样使用positive lookahead,而且还使用positive lookbehind,这可能不被一些旧的JS引擎支持。
const configString = `*** DO NOT CHANGE ***
{
JWT : { endpoint :"https://somelink1",
clientid :"consent-management",
grantType :"client_credentials" },
CMP : {endpoint :"https://someotherlink2",
contentType :"application/json"}
}
*** DO NOT CHANGE ABOVE EITHER *** `;
const regXLiteralKey =
// see ... [https://regex101.com/r/9Uejvk/1] ... positive lookahead only.
/\w+(?=\s*:\s*["{])/gm;
// // see ... [https://regex101.com/r/9Uejvk/4] ... full positive lookaround.
// /(?<=[{,]\s*)\w+(?=\s*:\s*["{])/gm;
const regXAsteriskComment =
// see ... [https://regex101.com/r/9Uejvk/3]
/\s*\*\*\*.*?\*\*\*\s+/gm;
const authObj = JSON.parse(
configString
.replace(regXAsteriskComment, '')
.replace(regXLiteralKey, '"$&"')
);
console.log({
authObj
});
console.log('authObj.JWT.endpoint ...', authObj.JWT.endpoint);
.as-console-wrapper { min-height: 100%!important; top: 0; }
我相信正则表达式将匹配第一个左大括号(在 JWT 之前)到第一个右大括号(在“client_credentials”之后)。
也许你可以删除注释中的“DO NOT CHANGE”部分,然后解析它:
let authObj = JSON.parse(auth.comment.replace('***DO NOT CHANGE***', ''));
或者如果这不适用于所有情况,则可能需要更正正则表达式以解析完整的 JSON 文本。