如何检测JavaScript文件只包含JSON数据,或者INTENDED包含JSON数据?

时间:2016-08-03 12:15:09

标签: javascript json

考虑到我们有一个名为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为例的原因是提出一个真实的单词样本。

2 个答案:

答案 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#工具中做了类似的事情。过了一段时间,团队注意到了模式识别的目的。

我的建议是为不同的文件创建模式,并建议最巧合的文件,或者如果你必须得到最匹配的文件类型......