Conversion d'une chaîne en objet JSON


149

Comment faire croire à JS qu'une chaîne est JSON?

J'ai une fonction qui ne fonctionne que si un objet JSON lui est passé. Si je lui passe une chaîne, avec le même format que JSON, cela ne fonctionne pas. Je veux donc faire en sorte que cette fonction pense que la chaîne qui lui est passée est un JSON. La chaîne est en effet au format JSON.

J'ai également essayé ce qui suit. J'ai entré la chaîne via Ajax, avec le paramètre "handle as" comme "JSON", puis quand j'ai passé le résultat à la fonction, cela fonctionne.

J'ai donc déduit que le problème ne venait pas de la chaîne. Comment convertir cette chaîne en JSON? Si j'obtiens la même chaîne via une requête ajax et que je la passe ensuite à la fonction fonctionne, alors que la transmission directe ne fonctionne pas.

La chaîne est la suivante:

  {
     "data": [
   {
  "id": "id1",
      "fields": [
        {
          "id": "name1",
          "label": "joker",
          "unit": "year"
        },
         {"id": "name2", "label": "Quantity"},
    ],
      "rows": [    data here....

and closing braces..


2
Votre titre est trompeur. Sur la base du contenu de votre question, je dirais plutôt que vous souhaitez convertir une chaîne contenant JSON en un objet / tableau JavaScript.
Felix Kling du

OK, je l'ai résolu. Il y avait un \ n dans la chaîne. Il ne reste plus qu'à comprendre comment utiliser JSON.parse avec cela.
Zer0

Ok je l'ai réparé. Aller jsonlint.com et y mettre votre chaîne. S'il dit que c'est correct, vous pouvez utiliser JSONParse pour obtenir la même chose.
Zer0

Au cas où quelqu'un lirait ceci, le titre est censé "convertir une chaîne JSON en objet"
Chris G

Réponses:


354
var obj = JSON.parse(string);

stringest votre chaîne json.


Cela ne fonctionne pas. Il lance une erreur "SyntaxError: JSON.parse: caractère inattendu". Il n'y a rien de mal avec la chaîne, car lorsque j'obtiens la même chaîne via une requête ajax et la gère comme "JSON", aucun problème ne se produit.
Zer0

s'il vous plaît poster votre chaîne JSON acutal
Kshitij

{"data": [{id ": - il vous manque un guillemet double ici, c'est-à-dire commençant par un guillemet double de l'identifiant
Kshitij

2
Lorsque je l'obtiens via Ajax, cela fonctionne comme il gère la réponse en tant que JSON. Je pense donc que je dois le convertir en objet JSON ..
Zer0

2
J'ai fini par aller sur jsonlint.com et m'assurer que mon Json a raison
Zer0

26

Vous pouvez utiliser le JSON.parse()pour cela.

Voir la documentation sur MDN

Exemple:

var myObj = JSON.parse('{"p": 5}');
console.log(myObj);

1
Cela ne fonctionne pas. Il lance une erreur "SyntaxError: JSON.parse: caractère inattendu". Il n'y a rien de mal avec la chaîne car lorsque j'obtiens la même chaîne via une requête ajax et la gère comme "JSON", aucun problème ne se produit.
Zer0 du

2
@ Zer0: Vous devriez mettre à jour votre question avec la façon dont vous l'essayez avec votre chaîne json.
Sarfraz du

4
@ Zer0: Nous ne pouvons répondre qu'au meilleur de nos connaissances. Vous dites que vous avez une chaîne JSON, nous répondons en conséquence. Il semble que votre chaîne soit différente, si vous la publiez, nous pouvons vous répondre en tenant compte de cela. Si vous posez une question sur le codage, le code / les données sont indispensables.
Felix Kling du

7

J'ai eu le même problème avec une chaîne similaire comme la vôtre

{id:1,field1:"someField"},{id:2,field1:"someOtherField"}

Le problème ici est la structure de la chaîne. L'analyseur json ne reconnaissait pas qu'il avait besoin de créer 2 objets dans ce cas. Donc ce que j'ai fait est un peu idiot, j'ai juste restructuré ma chaîne et ajouté le []avec ceci que l'analyseur a reconnu

var myString = {id:1,field1:"someField"},{id:2,field1:"someOtherField"}
myString = '[' + myString +']'
var json = $.parseJSON(myString)

J'espère que ça aide,

Si quelqu'un a une approche plus élégante, veuillez partager.


Dans votre code ci-dessus, vous avez construit de myStringmanière incorrecte. Ce n'est pas une chaîne et son format JSON est incorrect. Votre deuxième ligne deviendrait alors redondante. Voici ce que cela devrait être: var myString = '[{"id":1,"field1":"someField"},{"id":2,"field1":"someOtherField"}]' je sais que c'est un article assez ancien, mais j'ai pensé ajouter un peu de clarté au cas où quelqu'un le trouverait.
James Eberhardt

J'ai résolu mon problème en utilisant $.parseJSONJSON.parsene fonctionnait pas et en lançant une erreurJSON.parse is not a function
brasofilo


3

convertir la chaîne en HashMap en utilisant Object Mapper ...

new ObjectMapper().readValue(string, Map.class);

La carte en interne se comportera comme un objet JSON


2
var Data=[{"id": "name2", "label": "Quantity"}]

Passez la variable de chaîne dans l'analyse Json:

Objdata= Json.parse(Data);

Dans votre exemple, Dataest déjà un objet, il ne serait donc pas nécessaire de l'analyser. Vous auriez besoin de quelques guillemets entourant toutes vos données pour en faire une chaîne.
James Eberhardt

2

Utilisez simplement la evalfonction.

var myJson = eval(theJsibStr);

eval is evil, soyez très prudent à la sécurité avec cette approche
dparker

0

JSON.parse() la fonction fera l'affaire.

ou

En utilisant Jquery,

var obj = jQuery.parseJSON( '{ "name": "Vinod" }' );
alert( obj.name === "Vinod" );

0

Considérons que vous avez une chaîne comme

exemple: "nom: lucy, âge: 21 ans, sexe: femme"

function getJsonData(query){
    let arrayOfKeyValues = query.split(',');
    let modifiedArray =  new Array();
    console.log(arrayOfKeyValues);
    for(let i=0;i< arrayOfKeyValues.length;i++){
        let arrayValues = arrayOfKeyValues[i].split(':');
        let arrayString ='"'+arrayValues[0]+'"'+':'+'"'+arrayValues[1]+'"';
        modifiedArray.push(arrayString);
    }
    let jsonDataString = '{'+modifiedArray.toString()+'}';
    let jsonData = JSON.parse(jsonDataString);
    console.log(jsonData);
    console.log(typeof jsonData);
    return jsonData;
}

let query = "name:lucy,age:21,gender:female";
let response = getJsonData(query);
console.log(response);

»

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.