2016-09-13 8 views
-5

Ich habe eine Zeichenfolge wieParsing JSON von String mit JSON-Objekt

"Something has happened {\"prop1\":{\"name\":\"foo\"}}" 

und ich möchte die JSON analysieren, so dass ich die Zeichenfolge formatieren. Wie zum Beispiel:

Something has happened 
{ 
    "prop1":{ 
    "name":"foo" 
    } 
} 

In JavaScript, was wäre ein guter Weg, um dies zu erreichen.

Es kann mehrere Objekte in der Zeichenfolge geben und auch das Objekt ist nicht bekannt, es könnte viele verschachtelte Objekte oder Arrays enthalten. Danke im Voraus.

+0

betrügen? http://stackoverflow.com/questions/4935632/parse-json-in-javascript – httpNick

+0

* "Ich möchte das JSON analysieren, damit ich die Zeichenfolge formatieren kann." * Was genau bedeutet das? Ich bin mir nicht sicher, ob ich das Thema verstehe. Das String-Literal '" Etwas ist passiert {\ "prop1 \": {\ "name \": \ "foo \"}} "' produziert genau die Zeichenfolge, die Sie als Ergebnis haben wollen? –

+0

* "Damit ich die Zeichenkette formatieren kann" * - Wollen Sie nur die * ganze * Zeichenkette in dem gezeigten Format drucken, oder müssen Sie die JSON-Teile spezifisch extrahieren? Nehmen Sie an, dass jede Verwendung von '{' den Beginn von JSON innerhalb der größeren Zeichenfolge angibt? Sie haben verschachtelte Arrays erwähnt, aber kann das äußere Objekt ein Array sein wie '' Something something [1,2,3] ''? – nnnnnn

Antwort

0

Können wir annehmen, dass '{' und '}' den Anfang und das Ende des JSON anzeigen. Wenn ja, können Sie eine Teilzeichenfolge erhalten; Siehe Code unten. Sie könnten das Gleiche mit regulären Ausdrücken tun.

var str = "Something has happened {\"prop1\":{\"name\":\"foo\"}}" 
    var start = str.indexOf("{"); 
    var end = str.lastIndexOf("}"); 
    var json = str.substr(start, end); 
+0

Die Zeichenfolge enthält nicht nur ein Objekt, das einige Wörter enthalten kann, die sich nicht im Objekt befinden, sondern auch mehrere Objekte in einer Zeichenfolge wie "von {} bis {}". –

+0

Wenn ich mehrere Objekte haben kann, dann würde dies der Fall sein break wie in meiner Antwort oben "von {} zu {}" –

1

Die Mindest einfach werden würde ziemlich-Drucken der Zeichenfolge

OK dann. Nun eine wirklich einfache, nicht-optimierte, nicht-notwendigerweise robust ziemlich Druckfunktion könnte wie folgt aussehen:

function basicPrettyPrint(str) { 
 
    var output = ''; 
 
    var indentLevel = 0; 
 
    var indent = ' '; 
 
    var inQuotes = false; 
 
    for (var i = 0; i < str.length; i++) { 
 
    var current = str[i]; 
 
    if (current === '"' && indentLevel > 0) { 
 
     inQuotes = !inQuotes; 
 
     output += current; 
 
    } else if (inQuotes) { 
 
     output += current; 
 
    } else if (current === ',' && indentLevel > 0) { 
 
     output += ',\n' + indent.repeat(indentLevel); 
 
    } else if (current === '{' || current === '[') { 
 
     if (indentLevel === 0) output += '\n'; 
 
     output += current + '\n' + indent.repeat(++indentLevel); 
 
    } else if (current === '}' || current === ']') { 
 
     output += '\n' + indent.repeat(--indentLevel) + current; 
 
     if (indentLevel === 0) output += '\n'; 
 
    } else { 
 
     output += current; 
 
    } 
 
    if (indentLevel < 0) { 
 
     // parse failure: unbalanced brackets. Do something. 
 
    } 
 
    } 
 
    return output; 
 
} 
 

 
var input = 'Here is a "simple" object, for testing: {"prop1":{"name":"foo"}}And here is a more complicated one that has curly brackets within one of the property values:{"prop1":"{this is data, not an object}","arr":[1,{"a":"1","b":{"x":1,"y":[3,2,1]}},3,4]}And a non-nested array:[1,2,3]'; 
 

 
console.log(basicPrettyPrint(input));

Die oben darf nicht für entgangenen Anführungszeichen innerhalb Eigenschaften und wahrscheinlich eine Menge anderer Dinge, an die ich für eine kurze Demo nicht gedacht habe, aber ich überlasse diese Dinge als Übungen für den Leser ...

PS Die string .repeat() method muss möglicherweise polyfilled sein.

+0

Ja, ich dachte über diese Art von prozeduralen Ansatz, aber dachte, jemand könnte eine clevere Lösung haben. Vielen Dank –