Konwersja ciągu znaków na obiekt JSON

148

Jak sprawiasz, że JS myśli, że ciąg to JSON?

Mam funkcję, która działa tylko wtedy, gdy obiekt JSON jest do niego przekazywany. Jeśli przekażę do niego ciąg o tym samym formacie co JSON, to nie zadziała. Chcę więc, aby ta funkcja myślała, że ​​przekazany do niej ciąg to JSON. Ciąg jest rzeczywiście w formacie JSON.

Wypróbowałem również następujące. Wprowadziłem ciąg przez Ajax, z parametrem „uchwyt jako” jako „JSON”, a następnie, gdy przekazałem wynik do funkcji, działa.

Więc wydedukowałem, że problem nie dotyczy sznurka. Jak przekonwertować ten ciąg na JSON? Jeśli otrzymam ten sam ciąg za pośrednictwem żądania Ajax, a następnie przekazanie go do funkcji działa, podczas gdy bezpośrednie przekazanie go nie działa.

Ciąg jest następujący:

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

and closing braces..
Zer0
źródło
2
Twój tytuł jest mylący. Na podstawie treści twojego pytania wolałbym powiedzieć, że chcesz przekonwertować ciąg zawierający JSON na obiekt / tablicę JavaScript.
Felix Kling
OK, rozwiązałem to. W ciągu znaków był \ n. Teraz wystarczy dowiedzieć się, jak używać JSON.parse z tym.
Zer0
Ok, naprawiłem to. Przejdź do jsonlint.com i umieść tam swój ciąg. Jeśli mówi, że jest poprawny, możesz użyć JSONParse, aby osiągnąć to samo.
Zer0
Na wypadek, gdyby ktoś to przeczytał, tytuł powinien „konwertować ciąg JSON na obiekt”
Chris G

Odpowiedzi:

353
var obj = JSON.parse(string);

Gdzie stringjest twój ciąg json.

Kshitij
źródło
To nie działa. Zgłasza błąd „SyntaxError: JSON.parse: nieoczekiwany znak”. Nie ma nic złego w ciągu, ponieważ otrzymuję ten sam ciąg za pośrednictwem żądania AJAX i obsługuję go jako „JSON”, nie ma problemu.
Zer0
prześlij swój ciąg znaków JSON
Kshitij
{"data": [{id ": - brakuje tu podwójnego cudzysłowu, tj. rozpoczynającego się podwójnego cudzysłowu z id
Kshitij
2
Kiedy przechodzę przez Ajax, działa tak, jak wtedy obsługuje odpowiedź jako JSON. Więc myślę, że muszę przekonwertować to na obiekt JSON ..
Zer0
2
Skończyło się na tym, że wszedłem na jsonlint.com i upewniłem się, że mój Json jest prawidłowy
Zer0,
26

Możesz użyć JSON.parse()do tego.

Zobacz dokumentację w MDN

Przykład:

var myObj = JSON.parse('{"p": 5}');
console.log(myObj);
Sarfraz
źródło
1
To nie działa. Zgłasza błąd „SyntaxError: JSON.parse: nieoczekiwany znak”. Nie ma nic złego w ciągu, ponieważ otrzymuję ten sam ciąg za pośrednictwem żądania AJAX i obsługuję go jako „JSON”, nie ma problemu.
Zer0
2
@ Zer0: Powinieneś zaktualizować swoje pytanie o to, jak próbujesz, wraz z ciągiem json.
Sarfraz,
4
@ Zer0: Możemy odpowiedzieć tylko zgodnie z naszą najlepszą wiedzą. Mówisz, że masz ciąg JSON, odpowiadamy odpowiednio. Wygląda na to, że Twój ciąg jest inny, jeśli go opublikujesz, możemy odpowiedzieć, biorąc to pod uwagę. Jeśli zadajesz pytanie dotyczące kodowania, kod / dane są niezbędne.
Felix Kling
7

Miałem ten sam problem z podobnym sznurkiem, jak twój

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

Problem polega na strukturze struny. Parser json nie rozpoznał, że w tym przypadku musi utworzyć 2 obiekty. Więc to, co zrobiłem, jest trochę głupie, po prostu przebudowałem mój ciąg i dodałem []z tym, że parser rozpoznał

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

Mam nadzieję, że to pomoże,

Jeśli ktoś ma bardziej eleganckie podejście, podziel się nim.

Abraham
źródło
W powyższym kodzie utworzyłeś myStringnieprawidłowo. To nie jest ciąg i jest niepoprawnie sformatowany jako JSON. Twoja druga linia stałaby się wtedy zbędna. Oto, co powinno być: var myString = '[{"id":1,"field1":"someField"},{"id":2,"field1":"someOtherField"}]' wiem, że to dość stary post, ale pomyślałem, że dodam trochę jasności, jeśli ktoś go znajdzie.
James Eberhardt
Rozwiązałem swój problem, używając $.parseJSONgdzie JSON.parsenie działa i wyrzucając błądJSON.parse is not a function
brasofilo
3

przekonwertuj ciąg na HashMap za pomocą Object Mapper ...

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

Mapa wewnętrzna będzie zachowywać się jak obiekt JSON

Sugan V
źródło
2
var Data=[{"id": "name2", "label": "Quantity"}]

Przekaż zmienną łańcuchową do analizy Json:

Objdata= Json.parse(Data);
Ankita_systematix
źródło
W twoim przykładzie Datajest już obiektem, więc nie byłoby potrzeby jego analizowania. Potrzebowałbyś kilku cudzysłowów otaczających wszystkie dane, aby utworzyć ciąg.
James Eberhardt
2

Po prostu użyj evalfunkcji.

var myJson = eval(theJsibStr);
Siyavash Hamdi
źródło
eval jest zło, uważaj na bezpieczeństwo z takim podejściem
dparker
0

JSON.parse() funkcja wystarczy.

lub

Używając Jquery,

var obj = jQuery.parseJSON( '{ "name": "Vinod" }' );
alert( obj.name === "Vinod" );
Vinod Selvin
źródło
0

Rozważmy, że masz taki ciąg

przykład: „imię: Lucy, wiek: 21, płeć: kobieta”

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

`

Shishir
źródło