2
votes

JSON.parse ne crée pas d'objet json en javascript

J'arrive en dessous de la chaîne de l'amont. Je n'ai aucun contrôle dessus.

string
string
First:  "{'text': 'Airtel Tower(@ KT Tower in Bang, Greater K
n), 'sentiment': '0.25'}"
Second  {'text': 'Vodafone Tower (@ LT Tower in Delhi, Greater K
), 'sentiment': '0.25'}
undefined ---- undefined

Je veux changer la chaîne en JSON. Donc, la première chose que j'ai faite a été de supprimer le précédent b '....' (en amont se trouve un programme python qui produit une chaîne utf-8 en sortie). Je supprime donc "b" en utilisant substr ..

console.log(typeof(str));
var t = JSON.stringify(str);
console.log(typeof(t));
var t = JSON.parse(t);
console.log("First:  " + t);
var t = JSON.parse(t);
console.log("Second  " + t);
x = t.text;
y = t["text"];
console.log(x + " ---- " + y);

Ensuite, j'essaye de convertir la chaîne en JSON en utilisant JSON.stringify et JSON.parse .

str = msg.payload.substr(1);

Sortie de la console:

b"{'text': 'Airtel Tower (@ BT Tower in Chasdmzoa, Delhi)', 'sentiment': '0.25'}"

Il échoue convertissez-le en objet même si JSON.stringify a supprimé les guillemets supplémentaires, etc. et que JSON.parse ne semble pas fonctionner. Qu'est-ce que je fais mal?


4 commentaires

Vous devez également remplacer ' par " car JSON ne prend en charge que les guillemets doubles.


votre Airtel Tower (@ BT Tower à Chasdmzoa, Delhi) ' manque un guillemet simple ' au début?


Je ne sais pas pourquoi 1 vote positif car les données en question sont erronées


J'ai supprimé le guillemet simple manquant lors de la copie par erreur. Mis à jour maintenant. @molamk


3 Réponses :


0
votes

Réponse la plus simple (pour les non-anti- eval -zealots):

var string = msg.payload.substring(3,msg.payload.length-2);
var t = JSON.parse(string.replace(/'/g, "\""));

Si vous ne supportez pas, ou ne pouvez pas utiliser (mode strict? ), eval , vous devez alors convertir les guillemets simples en guillemets doubles pour l'analyse, car JSON n'accepte que les guillemets doubles:

var string = msg.payload.substring(3,msg.payload.length-2);
var t = eval("(" + string + ")");


0 commentaires

1
votes

Il y a un problème ici: les chaînes littérales entre guillemets simples ne sont pas JSON valides. JSON est basé sur JavaScript, mais ce n'est pas la même chose. Si vous écrivez un objet littéral dans du code JavaScript, très bien; si vous avez réellement besoin de JSON, vous devez utiliser ".


0 commentaires

3
votes

const input = "b'\"{'text': 'Airtel Tower (@ BT Tower in Chasdmzoa, Delhi)', 'sentiment': '0.25'}\"'";

const cleanString = str => str.split('"')[1].replace(/'/g, '"');

console.log(input);

// Result
console.log(JSON.parse(cleanString(input)));

Explication

  1. Fractionner la chaîne avec le guillemet double " comme délimiteur
  2. Obtenez le deuxième élément. Cela vous donnera {'text': 'Airtel Tower (@ BT Tower in Chasdmzoa, Delhi)', 'sentiment': '0.25'}
  3. Remplacer guillemets simples ' avec guillemets doubles ". Cela vous donnera {" text ":" Airtel Tower ( @ BT Tower à Chasdmzoa, Delhi) "," sentiment ":" 0.25 "}
  4. Appelez JSON.parse sur la chaîne précédente pour avoir votre objet


1 commentaires

L'explication a aidé.