2017-09-26 1 views
0

Je détesterais ouvrir une nouvelle question même si de nombreuses questions ont été ouvertes sur ce même sujet, mais je suis littéralement à mes fins quant à savoir pourquoi ce n'est pas travail.JSON.parse() retourne une chaîne à la place de l'objet

Je cherche à créer un objet JSON avec le code suivant:

   var p = JSON.stringify(decodeJSON('{{post.as_json}}')) 
       var post = JSON.parse(p); 
       console.log(post); // Debug log to test if code is valid 

Et la fonction decodeJSON:

function decodeJSON(json) { 
     var txt = document.createElement("textarea"); 
     txt.innerHTML = json; 
     return txt.value.replace(/u'/g, "'"); 
     } 

console.log(post) renvoie la chaîne JSON suivante:

{'content': 'kj fasf', 'uid': '4eL1BQ__', 'created': '07/09/2017', 'replies': [], 'tags': ['python'], 'by': {'username': 'Dorian', 'img_url': '/static/imgs/user_Dorian/beaut.jpg'}, 'likes': 0} 

Après avoir parcouru la ficelle, je suis sûr que t Le JSON est valide et il n'y a pas d'erreurs de syntaxe. Cependant, lors de l'exécution JSON.parse(p) Au lieu de recevoir un objet, je récupère une chaîne. Quelle pourrait-être la cause?

+4

Ce n'est pas une chaîne JSON. JSON utilise '" ', pas' '' – baao

+0

@baao Je pensais que cela pouvait aussi être la cause.J'ai donc essayé de remplacer tous les '' 'avec' "', mais j'ai alors une erreur 'Invalid token'. –

+0

Il semble que vous utilisiez un moteur de template. Si oui, tout ce que vous avez à faire est 'var post = {{post.as_json}};' et appelez-le un jour. Cependant, cela suppose que 'as_json' renvoie vraiment JSON, ce qui ne semble pas être le cas. Vous devriez corriger cela en premier. Tout le reste est juste une solution de contournement hacky. –

Répondre

0

Le problème dans votre code est que vous exécutez JSON.stringify sur une chaîne elle-même. Donc, lors de l'analyse, le résultat de cette chaîne sera une chaîne. En effet, vous avez deux fois stringifié et analysé une fois. Si vous l'analysez une fois de plus, vous obtiendrez un JSON. Mais pour solution, évitez la stringification deux fois.

Remplacez votre code.

var p = decodeJSON('{{post.as_json}}'); 

qui fonctionnera

+0

Il me donne «SyntaxError Uncaught: jeton inattendu» dans JSON à la position 1' –

+0

@DorianDore, jetez un oeil à ma réponse mise à jour. –

1

C'est parce que decodeJSON retourne une chaîne, et que JSON.stringify tourne chaîne dans une autrechaîne.

D'autre part, vous avez utilisé la méthode JSON.strigify() sur une chaîne. Vous devez stringifier un objet, pas chaîne.

JSON.stringify() turns a javascript object to json text and stores it in a string.

Lorsque vous utilisez JSON.parse vous obtenez la chaîne retournée par decodedJSON fonction, et non l'objet.

Solution:

var p = JSON.stringify('{{post.as_json}}'); 
var post = JSON.parse(p); 
console.log(post); 

It gives me Uncaught SyntaxError: Unexpected token ' in JSON at position 1

La solution est de modifier votre méthode decodeJSON.

function decodeJSON(json) { 
    var txt = document.createElement("textarea"); 
    txt.innerHTML = json; 
    return txt.value.replace(/u'/g, '\"'); 
} 

var p = decodeJSON('{{post.as_json}}'); 
var post = JSON.parse(p); 
console.log(post);