2016-08-03 2 views
2

Bedenken Sie, dass wir eine Datei namens configuration.js haben, und wenn wir nach innen schauen wir sehen:Wie erkennt man, dass eine JavaScript-Datei nur JSON-Daten enthält oder dass sie JSON-Daten enthalten soll?

'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": "" 
       } 
      ] 
     } 
    ] 
}; 

In diesem Fall wird der Inhalt der .js Datei JSON werden nur dazu gedacht, noch für einige IDE Gründen ist es angegeben als eine JavaScript-Anweisung, damit die IDE den Inhalt erkennt und korrekt formatiert. Diese Datei kann in einem anderen Szenario enthalten:

{ 
    "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": "" 
     } 
     ] 
    } 
    ] 
} 

In beiden Fällen ist die Erweiterung von Dateien sind besser .json zu sein, anstatt .js zu sein. Wir erstellen ein Qualitätstool mit vielen Funktionen, von denen einer dem Entwickler vorschlägt, die Erweiterung der Datei basierend auf dem Inhalt zu ändern.

Wie können wir in beiden Fällen sicherstellen, dass die Datei nur JSON enthält oder nur JSON enthalten soll?

Hinweis: Der Grund für komplexe JSON ist hier als Beispiel, eine echte Stichprobe vorzuziehen.

+2

das erste Schnipsel ist definitiv Javascript, nicht JSON –

+0

Sie müssen nach Mustern im Inhalt der Datei suchen, Sie müssen definieren, was eine JSON-Datei gültig macht und suchen ... versuchen Sie nach: '{" '...' ":" '...' "}' ausgenommen Leerzeichen, Zeilenende ... –

+0

Ihr erstes Beispiel enthält nur ein JS-Objekt (auch das zweite kann ein JS-Objekt sein, nur ohne direkte Zuweisung). Wenn Sie eine Datei zur Verwendung in JS hinzufügen, können Sie auf das zweite Beispiel in keiner Weise zugreifen. Und was meinst du mit "JSON"? – Justinas

Antwort

1

Um den zweiten Fall abzudecken, müssten Sie nur die Datei einem JSON-Parser mit sehr strengen Einstellungen zuführen; Wenn die Datei abgelehnt wird, handelt es sich nicht um eine JSON-Datei.

Um die erste, na ja, solange Sie nur versuchen, diesen sehr speziellen Fall zu validieren, eine Möglichkeit wäre, einige Regex zu verwenden, um sowohl das Semikolon am Ende und die 'use strict'; var something = am Anfang zu entfernen, und übergeben Sie den resultierenden bereinigten Text durch einen JSON-Parser, um festzustellen, ob es gültiger JSON ist. Wenn Sie kompliziertere Fälle behandeln müssen, könnten Sie einen JavaScript-Parser verwenden, um einen AST aus der Datei zu generieren, und dann durch den Baum gehen, um ihn zu validieren (wenn er beispielsweise eine einzelne Variable, keine Funktionen, keine ... enthält) Aussagen usw.). Natürlich wäre das etwas komplexer, wenn auch sehr mächtig.

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(', '));

0

Sie werden nach Mustern in den Inhalt der Datei suchen haben, müssen Sie definieren, was ein für sie JSON-Datei gültig und suchen Sie macht ... versuchen, für die Suche: {" ... ":" ... "} ohne Leerzeichen, Ende der Zeilen ... Ich benutze, um so etwas in einem Word + C# -Tool erstellt, um Verträge zu bearbeiten, und nach einer Weile bemerkte das Team, dass die Mustererkennung war gehen.

Mein Vorschlag ist, Muster für die verschiedenen Dateien zu erstellen und die Dateien deuten darauf hin, dass die meisten Zufälle bekam oder, wenn Sie einen Dateityp haben, der die meisten Treffer Tipp ...