2013-08-14 27 views
8

Deshalb möchte ich dieses JSON-Objekt erstellen:erstellen JSON aus string, als Objekt verwenden

{ 
    "id":"3", 
    "created":"0000-00-00", 
    "parentIDs":null, 
    "childIDs":"", 
    "uid":"movies", 
    "title":"Movies", 
    "related":"movies", 
    "pos":"", 
    "css":"{ "background-image":"-webkit-linear-gradient(bottom, rgb(46,44,46) 49%, rgb(18,17,18) 75%)" }" 
} 

von string:

value = ""id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":""" 

Diese Zeichenfolge aus einer Datenbank kommt, so kann ich nicht wirklich die Formatierung ändern, aber es sollte so sein.

(Dieser String stammt aus einer Reihe von ähnlichen Saiten, die ich durch iterieren, irgendwie die {} um sie zu verlieren)

Ich habe versucht, die äußeren Anführungszeichen mit value.substr(1, value.length - 2); entfernen. Und dann wandle es mit .toJSON(); um, aber es fügt nur eine ganze Menge zusätzlicher Schrägstriche hinzu, die ich nicht brauche.

Ich muss nur {} um es hinzufügen, und dann würde JavaScript es als JSON-Objekt sehen.

Gibt es eine Kurzform, das zu tun? Oder gibt es eine kleine Bibliothek, die meine chaotische Zeichenfolge geschickt in ein JSON-Objekt umwandeln kann?

[update] 

ich versucht: eval('{' + value + '}'); aber ich bekomme Uncaught SyntaxError: Unexpected token : in Chrome.

Ich versuchte JSON.parse, aber erhalten: TypeError: JSON.parse is not a function in Chrome und Firefox, muss es die Formatierung der Zeichenfolge sein. Ich fange an, den "css" -Eintrag zu verdächtigen, obwohl er anfängt, sich bei dem ersten "id" -Eintrag zu beschweren, erwartet er eine Funktion anstelle von JSON?

(schneide ich den rohen JSON nach unten, aber vergessen, die wichtigsten "css" one)

[update2]

Ok, also habe ich die CSS-Daten zu ' statt ", jetzt wird es tatsächlich parse, aber jetzt ist mein Skript kaputt, weil ich Roh-CSS von der db erwarte, eine Möglichkeit, die resultierende 'css':'blabla' zu ändern: "css":"blabla"?

+2

Es gibt kein JSON-Objekt. Es gibt JSON-Strings und JavaScript-Objekte; welche der beiden willst du bekommen? Sind Sie sicher, dass es keinen besseren Weg gibt? "I iterate through" sagt mir, dass es Ihr Code ist, der das erzeugt, also sollten andere Optionen verfügbar sein. – Jon

+0

* "Ich muss nur {} hinzufügen, und dann würde Javascript es als JSON-Objekt sehen." * Nein. Wenn Sie am Anfang und am Ende '' '' '' 'hinzufügen, haben Sie möglicherweise eine Zeichenfolge enthält gültiges JSON (kein Objekt). Aber das willst du, oder? Wenn Sie stattdessen ein JavaScript-Objekt verwenden möchten, müssen Sie die neue Zeichenfolge an 'JSON.parse' übergeben. Ich denke, Sie sollten sich http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/ ansehen, um eine bessere Vorstellung von den Unterschieden zwischen JSON- und JavaScript-Objekten zu bekommen . –

+0

Grundsätzlich möchte ich ein benutzbares Objekt haben, auf das ich zB über value.id zugreifen kann, was ich nicht machen kann, wenn es eine Zeichenkette ist. – TrySpace

Antwort

14

Wenn Sie eine Zeichenfolge mit gültigem JSON haben, können Sie sie mithilfe von JSON.parse() in ein JavaScript-Objekt konvertieren.

Sie haben Unter der Annahme eine Zeichenfolge:

value = '"id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":""'; 

Sie würden dann tun:

obj = JSON.parse("{"+value+"}");JSON 

Hinweis die {} als Teil der Zeichenfolge muss ein gültiger JSON-String zu sein.

+0

Versucht dies, aber bekommen "TypeError: JSON.parse ist keine Funktion" jedes Mal .. Wahrscheinlich, weil es nicht korrekt ist JSON – TrySpace

+1

Welchen Browser benutzen Sie? JSON.parse ist in fast jedem aktuellen Browser verfügbar - http://caniuse.com/json – knolleary

+1

@TrySpace: Nein, das hat nichts damit zu tun. Ihr Browser scheint diese Funktion nicht zu implementieren. Sie können json3 in diesem Fall einschließen: https://github.com/bestiejs/json3. –

0

Was Sie suchen ist JSON.parse:

var str = '{"id":"3", 
"created":"0000-00-00", 
"parentIDs":null, 
"childIDs":"", 
"uid":"movies", 
"title":"Movies", 
"related":"movies", 
"pos":""}', 
    foo = JSON.parse(str); 

Es sicherlich sauberer obwohl aussehen könnte.

+0

Die Zeichenfolge ist jedoch kein gültiger JSON. –

+0

@FelixKling Wie sieht es jetzt aus? – federicot

+1

Besser, aber das OP hat es nicht. Sie müssen wahrscheinlich erklären, wie Sie die Zeichenfolge des OP in eine Zeichenfolge mit gültigem JSON konvertieren. –

2

Hier ist ein bisschen eine Problemumgehung, wenn Sie sagen, der Grund, warum Ihre Zeichenfolge nicht analysiert, ist, weil die nächste Dimension Ihres JSON-Arrays in Anführungszeichen eingeschlossen ist. Ich bin sicher, dass es einen besseren Weg gibt.

var value = '"id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":"","css":"{ "background-image":"-webkit-linear-gradient(bottom, rgb(46,44,46) 49%, rgb(18,17,18) 75%)" }"'; 

value = value.replace("\"{", "{"); 
value = value.replace("}\"", "}"); 

value = "{"+value+"}"; 
value = JSON.parse(value); 

console.log(value); 

Und hier ist mein fiddle

6

ok, so ist dies das Beste, was ich tun konnte:

var value = '"id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":"","css":"{ "background-image":"-webkit-linear-gradient(bottom, rgb(46,44,46) 49%, rgb(18,17,18) 75%)" }"'; 
var nestedObjects = []; 
String.prototype.trimQuotes = function() { 
    return this.indexOf('"') === this.lastIndexOf('"') ? this.substring(this.indexOf('"') + 1) : this.substring(this.indexOf('"') + 1, this.lastIndexOf('"')); 
}; 
function convertObject(str) { 
    var retObj = {}; 
    $.each(str.split(','), function() { 
     var keypair = this.split(':'); 
     if (keypair.length < 2) { return; } 
     retObj[keypair[0].trimQuotes().trim()] = keypair[1].indexOf('@') > -1 ? nestedObjects[parseInt(keypair[1].trimQuotes().substring(1), 10)].trimQuotes().trim() : keypair[1].trimQuotes(); 
    }); 
    return retObj; 
} 
var temp = value.split('{')[0]; 
$.each(value.split('{'), function (i, t) { 
    if (i === 0) { 
     return; 
    } 
    var splits = t.split('}'); 
    nestedObjects.push(splits[0]); 
    temp += '@' + (i - 1); 
    if (splits.length > 1) { 
     temp += splits[1]; 
    } 
}); 

http://jsfiddle.net/SkCVd/5/

+0

+1 Das funktioniert, scheint ein wenig überentwickelt, aber es funktioniert. – Reimius

3

hier ist ein Parser REGx!

var tmp = '"id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":"","css":"{ "background-image":"-webkit-linear-gradient(bottom, rgb(46,44,46) 49%, rgb(18,17,18) 75%)" }"' ; 
var reg = /"(\w+)":(?:"([\w-]*)"|"{([^}]*)}"|(null))/g; 
var obj ={}; 
tmp.replace(reg,function(text,all,dall,hall,vall){ 
    obj[all]=hall||dall||vall; 
    console.log(all +":"+obj[all]); 
}); 

ist es ganz einfach, nicht wahr?

4

Es ist eingebaut Option in jquery zu String in Json zu analysieren.

als

var str = '{ "id":"3", "created":"0000-00-00", "parentIDs":null, "childIDs":"", "uid":"movies", "title":"Movies", "related":"movies", "pos":"", "css":"{ background-image:-webkit-linear-gradient(bottom, rgb(46,44,46) 49%, rgb(18,17,18) 75%) }"}'; 
    $(document).ready(function() { 

     var result = jQuery.parseJSON(str); 
     console.log(result); 
    }); 

entfernt " von CSS Teil
Hier ausgegeben enter image description here unter URL verweisen http://api.jquery.com/jQuery.parseJSON/

0

Wie über diese

var arr = new Function('return {' + value + '}')(); 

Dies ist sicherer und schneller Äquivalent für eval und JSON.parse für Ihre Anforderung.

2

Wie jeder bereits erwähnt jQuery.parseJSON() ist der Weg. In Ihrem Fall müssen Sie die Zeichenfolge, die Sie von SQL zuerst immer reinigen, sonst werden Sie nicht in der Lage sein, in die richtige json zu analysieren:

// format from SQL : value = "validJSON" 
var fromSQL = 'value = ""id":"3","created":"0000-00-00","parentIDs":null,"childIDs":"","uid":"imdb","title":"Imdb","related":"movies","pos":"""'; 

// we need to remove @value ="' at the beginnig and '"' at the end 
var withoutWrapper = fromSQL.substring(('value = "').length, fromSQL.length-1); 

// now add {} to make it as a json obj 
var withNewWrapper = '{' +withoutWrapper +'}'; 

// parse it 
var json= jQuery.parseJSON(withNewWrapper); 

Hier Funktionsbeispiel: http://jsfiddle.net/vojtiik/pzJTa/

Tools wie diese JsonViewer hilft immer!

0

Ich verstehe, dass Sie diese Zeichenfolge nicht mit AJAX erhalten, sondern sie direkt in ein Skript auf der Serverseite einbetten - es muss also nicht am Client analysiert werden (JSON.parse wird hier nicht benötigt).

var data_object = { 
"id":"3", 
    "created":"0000-00-00", 
    "parentIDs":null, 
    "childIDs":"", 
    "uid":"movies", 
    "title":"Movies", 
    "related":"movies", 
    "pos":"", 
    "css":'{ "background-image":"-webkit-linear-gradient(bottom, rgb(46,44,46) 49%, rgb(18,17,18) 75%)" }' 

} 

Achten Sie auf CSS-Eigenschaft (wenn Sie Anführungszeichen in Zeichenfolge aufnehmen möchten, können Sie einfach verschiedene Angebote nutzen beginnen und Ende der Zeichenfolge Markierung): Objektdaten gemäß JSON Regeln schreiben richtig Alles, was Sie brauchen. Es gibt keinen anderen Weg - Sie müssen nur Ihre String-Konstanten richtig zitieren.