gpt4 book ai didi

javascript - 如何检测一个 JavaScript 文件只包含 JSON 数据,还是打算包含 JSON 数据?

转载 作者:行者123 更新时间:2023-11-30 00:05:22 33 4
gpt4 key购买 nike

假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到:

'use strict';
var profile = {
"project": "%ProjectsRoot%\\SampleProject\\Site\\Site.csproj",
"projectsRootKey": "%ProjectsRoot%",
"ftp": {
"address": "ftp://192.168.40.50/",
"username": "",
"password": ""
},
"delete": [
"\\b(bin)\\b.*\\.config",
"\\b(bin)\\b.*\\.js",
"\\b(bin)\\b.*\\.css",
"bin\\\\(?!ProjectName).*\\.(dll|pdb)"
],
"replace": [
{
"file": "Web.config",
"items": [
{
"regex": "(<appSettings file=\")(bin\\\\)(Settings.config\">)",
"newValue": "$1$3"
},
{
"regex": "<remove\\s*segment=.bin.\\s/>",
"newValue": ""
}
]
}
]
};

在这种情况下,.js 文件的内容旨在仅为 JSON,但由于某些 IDE 原因,它被声明为 JavaScript 语句,以便 IDE 识别内容并正确格式化。此文件在另一种情况下可能包含:

{
"project": "%ProjectsRoot%\\SampleProject\\Site\\Site.csproj",
"projectsRootKey": "%ProjectsRoot%",
"ftp": {
"address": "ftp://192.168.40.50/",
"username": "",
"password": ""
},
"delete": [
"\\b(bin)\\b.*\\.config",
"\\b(bin)\\b.*\\.js",
"\\b(bin)\\b.*\\.css",
"bin\\\\(?!ProjectName).*\\.(dll|pdb)"
],
"replace": [
{
"file": "Web.config",
"items": [
{
"regex": "(<appSettings file=\")(bin\\\\)(Settings.config\">)",
"newValue": "$1$3"
},
{
"regex": "<remove\\s*segment=.bin.\\s/>",
"newValue": ""
}
]
}
]
}

在这两种情况下,文件的扩展名最好是.json,而不是.js。我们正在创建一个具有许多功能的质量工具,其中之一是建议开发人员根据内容更改文件的扩展名。

在这两种情况下,我们如何确保文件只包含 JSON,或者只包含 JSON?

注:此处以复杂的JSON为例,是为了提供一个真实的样本。

最佳答案

要涵盖第二种情况,您需要做的就是将文件提供给一些具有非常严格设置的 JSON 解析器;如果它拒绝该文件,那么它就不是 JSON 文件。

为了涵盖第一个,好吧,只要您只是试图验证那个非常具体的情况,一种可能性是使用一些正则表达式来删除末尾的分号和 'use strict '; var something = 开始,然后将生成的清理文本传递给 JSON 解析器以查看它是否是有效的 JSON。

如果你需要处理更复杂的情况,你可以使用一些 JavaScript 解析器从文件中生成一个 AST,然后遍历树来验证它(比如,如果它包含一个变量,没有函数,没有语句, ETC)。当然,这会稍微复杂一些,但功能非常强大。

var STRICT_JSON_EXAMPLE = '{"value": "ok"}';
var JSON_LIKE_EXAMPLE = '\'use strict\';\nvar somevar = {"value": "ok"};';
var NON_JSON_EXAMPLE = 'alert("!!!");';

var EXAMPLES = [ STRICT_JSON_EXAMPLE, JSON_LIKE_EXAMPLE, NON_JSON_EXAMPLE ];

function isStrictJSON(text) {
try {
JSON.parse(text);
return true;
} catch (e) {
return false;
}
}

function isJSONLike(text) {
var regex = /^\s*(['"]use strict['"]\s*;?)?\s*var\s+\w+\s*=\s*(.*?);?$/;
var cleanedText = text.replace(regex, '$2');
return isStrictJSON(cleanedText);
}

alert('Strict JSON: ' + EXAMPLES.map(isStrictJSON).join(', ') +
'\nJSON-like: ' + EXAMPLES.map(isJSONLike).join(', '));

关于javascript - 如何检测一个 JavaScript 文件只包含 JSON 数据,还是打算包含 JSON 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38743386/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com