2016-08-08 34 views
0

Lassen Sie uns sagen, dass ich diese Zeichenfolge von einem Socket-Server empfangen (die ich nicht kontrollieren kann):Wie kann ich eine Zeichenfolge mit n verketteten JSON-Zeichenfolge in Javascript/NodeJs teilen?

{"data":{"time":"2016-08-08T15:13:19.605234Z","x":20,"y":30}}{"data":{"time":"2016-08-08T15:13:19.609522Z","x":30,"y":40}} 

Ich kann JSON.parse nicht verwenden, da es 2 string Json enthält so wie kann ich in

gespalten
var jsonString1 = {"data":{"time":"2016-08-08T15:13:19.605234Z","x":20,"y":30}} 

und

var jsonString2 = {"data":{"time":"2016-08-08T15:13:19.609522Z","x":30,"y":40}} 

Anmerkung: ich kann 1 bis n Json Strings in der Tat

verketteten
+0

So haben Sie eine Reihe von jsons, mit zu beginnen. Sie sollten dann das Array von jsons zuerst analysieren und dann jedes json separat. So mache ich es mit Newtonsoft's Bibliothek für .net. – Veverke

+0

Ich würde jedes Zeichen der Zeichenfolge durchlaufen, zählen Sie die Anzahl der Zeichen "{" und "}". Sobald die Menge von '{' gleich der Menge von '}' ist, wissen Sie, dass Ihre erste JSON-Zeichenfolge beendet ist. Außer natürlich, wenn Sie die Schleife starten und der Betrag für beide ist 0 –

+2

Wie wäre es mit der Aufteilung der ursprünglichen Zeichenfolge mit 'Split ("} {")'? –

Antwort

5

Sie könnten nur tun:

var data = '{"data":{"time":"2016-08-08T15:13:19.605234Z","x":20,"y":30}}{"data":{"time":"2016-08-08T15:13:19.609522Z","x":30,"y":40}}'; 
 

 
var sanitized = '[' + data.replace(/}{/g, '},{') + ']'; 
 
var res = JSON.parse(sanitized); 
 

 
console.log(res);

Dies wird jedoch fehlschlagen, wenn eines der Objekte enthält die }{ Muster in einen String.

+0

Es funktioniert, aber ich möchte x, y drucken: siehe https://jsfiddle.net/ys6j038q/ – user310291

+0

Ich frage ergänzende Frage hier: http://stackoverflow.com/questions/38834601/how-to-get- xy-from-nest-object – user310291

+0

Was Sie hier bekommen, ist eine Anordnung von Objekten. Wenn Sie auf die Eigenschaft 'x' des zweiten Objekts zugreifen möchten, müssen Sie' res [1] .data.x' eingeben. – Arnauld

3

Sie können sie durch das Auftreten von } direkt gefolgt von { teilen (Whitespace ignorieren).

var parts = str.split(/\}\s*\{/g); 
for(var i = 0; i < parts.length; i++) { 
    var part = parts[i].trim(); 

    if(part[0] !== '{') part = '{' + part; 
    if(part[part.length-1] !== '}') part += '}'; 

    var json = JSON.parse(part); 
} 
+0

Aber jeder JSON enthält verschachtelte Objekte. Was ist, wenn Daten: {} sind? – Veverke

+0

@ Veverke Diese Objekte werden durch ein Komma getrennt. –

+0

Ich habe etwas weniger fest verdrahtet versucht. Wenn das Problem dadurch gelöst wird, ist es die Antwort :) – Veverke

1

Nur teilen, wenn /\}\s*\{/g und übergeben Sie einen Wert zu füllen, um die Array.prototype.reduce Funktion.

var str = '{"data":{"time":"2016-08-08T15:13:19.605234Z","x":20,"y":30}}{"data":{"time":"2016-08-08T15:13:19.609522Z","x":30,"y":40}}' 
 

 
var data = (function(input) { 
 
    let odd = true; 
 
    
 
    return input.split(/\}\s*\{/g).reduce(function(res, part, i) { 
 
    if(odd) { 
 
     part += "}"; 
 
    } else { 
 
     part = "{" + part; 
 
    } 
 
    
 
    odd = !odd; 
 
    
 
    res[i] = JSON.parse(part); 
 
    
 
    return res; 
 
    }, {}); 
 
})(str) 
 

 
console.log("data:", data);