Disons que je reçois cette chaîne d'un serveur socket (que je ne peux pas contrôler):

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

Je ne peux pas utiliser JSON.parse car il contient 2 chaînes Json alors comment puis-je me diviser en

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

Et

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

Remarque: je peux avoir 1 à n chaînes Json concaténées en fait

1
user310291 8 août 2016 à 18:22

3 réponses

Meilleure réponse

Vous pourriez simplement faire:

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);

Cependant, cela échouera si l'un des objets contient le modèle }{ dans une chaîne.

6
Arnauld 8 août 2016 à 15:33

Vous pouvez les diviser par l'occurrence de } suivie directement de { (en ignorant les espaces blancs).

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);
}
4
micah 8 août 2016 à 15:26

Il suffit de diviser quand /\}\s*\{/g et de passer une valeur à remplir à la fonction Array.prototype.reduce.

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);
1
Hitmands 8 août 2016 à 15:39