考虑到我们有一个名为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为例的原因是提出一个真实的单词样本。
答案 0 :(得分:1)
为了涵盖第二种情况,您需要做的就是将文件以非常严格的设置提供给某些JSON解析器;如果它拒绝该文件,那么它将不是JSON文件。
为了覆盖第一个,好吧,只要您只是尝试验证这个非常具体的情况,一种可能性就是使用一些正则表达式来删除末尾的分号和'use strict'; var something =
处的分号。开始,然后通过JSON解析器传递生成的清理文本,看看它是否是有效的JSON。
如果您需要处理更复杂的情况,可以使用一些JavaScript解析器从文件生成AST,然后遍历树以验证它(例如,如果它包含单个变量,没有函数,没有语句等)。当然,虽然非常强大,但这会稍微复杂一些。
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(', '));
答案 1 :(得分:0)
您必须在文件内容中搜索模式,您必须定义使json文件有效的内容并搜索它...尝试搜索:{"
... { {1}} ... ":"
不包括空格,行尾...
我在创建用于编辑合同的Word + C#工具中做了类似的事情。过了一段时间,团队注意到了模式识别的目的。
我的建议是为不同的文件创建模式,并建议最巧合的文件,或者如果你必须得到最匹配的文件类型......