字符串到对象和点符号(Javascript)[关闭]

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

在我正在开发的应用程序中,我将一些配置存储在对象文字的备注字段中。 enter image description here

 {
    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);

enter image description here

通常我会使用点符号

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

javascript json regex string parsing
2个回答
2
投票

如何将配置视为字符串,但通过简单的

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; }


0
投票

我相信正则表达式将匹配第一个左大括号(在 JWT 之前)到第一个右大括号(在“client_credentials”之后)。

也许你可以删除注释中的“DO NOT CHANGE”部分,然后解析它:

let authObj = JSON.parse(auth.comment.replace('***DO NOT CHANGE***', ''));

或者如果这不适用于所有情况,则可能需要更正正则表达式以解析完整的 JSON 文本。

© www.soinside.com 2019 - 2024. All rights reserved.