Pytanie Parsować JSON w JavaScript? [duplikować]


To pytanie już zawiera odpowiedź:

Chcę przetworzyć ciąg JSON w JavaScript. Odpowiedź jest coś w stylu

var response = '{"result":true,"count":1}';

Jak mogę uzyskać wartości result i count od tego?


1515
2018-02-08 16:34


pochodzenie


var json = '{"result": true, "count": 1}', obj = JSON.parse (json); console.log (obj.count); // jeśli użyjesz w nodejs, użyj konsoli - Shekhar Tyagi


Odpowiedzi:


Obsługuje większość przeglądarek JSON.parse(), który jest zdefiniowany w ECMA-262 5. wydanie (specyfikacja, na której oparty jest JavaScript). Jego użycie jest proste:

var json = '{"result":true,"count":1}',
    obj = JSON.parse(json);

alert(obj.count);

W przypadku przeglądarek, których nie można wdrożyć za pomocą json2.js.

Jak zauważono w komentarzach, jeśli już używasz jQuery, istnieje $.parseJSON funkcja, która mapuje do JSON.parse jeśli dostępne lub w formie eval w starszych przeglądarkach. Jednak powoduje to dodatkowe, niepotrzebne kontrole, które są również wykonywane przez JSON.parse, więc dla najlepszego wszechstronnego działania polecam używanie go w następujący sposób:

var json = '{"result":true,"count":1}',
    obj = JSON && JSON.parse(json) || $.parseJSON(json);

Zapewni to korzystanie z natywnego JSON.parse natychmiast, zamiast przeprowadzania przez jQuery sprawdzania poprawności ciągu przed przekazaniem go do natywnej funkcji analizowania.


1868
2018-02-08 16:38



@Marwan: IE 8+ obsługuje JSON.parse(). W przypadku IE 6, 7 i innych starszych przeglądarek możesz użyć pliku json2.js, do którego linkowałem z mojego posta. Alternatywnie, ale mniej bezpiecznie, możesz użyć eval. - Andy E
Chyba że on też potrzebuje JSON.stringify() - ThiefMaster♦
Uwaga dla recenzentów: przed edycją należy dokładnie sprawdzić edycje, ponieważ Twoje działania mogą powodować niepożądane efekty uboczne dla użytkowników kopiujących i wklejających kod z odpowiedzi. - Andy E
Nie jest konieczne sprawdzanie najpierw obsługi rodzimej, a następnie powrót do jQuery. jQuery 1.10 próbuje JSON.parse po pierwsze, to własna implementacja. jQuery 2.x dzwoni bezpośrednio JSON.parse bez sprawdzania lub powrotu. - Jasha
Szczegóły obsługi przeglądarki: Czy mogę korzystać z parsowania JSON - Peter V. Mørch


Przede wszystkim musisz się upewnić, że kod JSON jest ważny.

Po tym polecam używanie biblioteki JavaScript, takiej jak jQuery lub Prototype, jeśli możesz, ponieważ te rzeczy są dobrze obsługiwane w tych bibliotekach.

Z drugiej strony, jeśli nie chcesz korzystać z biblioteki i możesz ręczyć za poprawność obiektu JSON, po prostu owinąłbym ten ciąg w anonimową funkcję i użyłbym funkcji eval.

Nie jest to zalecane, jeśli otrzymujesz obiekt JSON z innego źródła, które nie jest absolutnie zaufane, ponieważ funkcja eval pozwala na kod renegata, jeśli chcesz.

Oto przykład użycia funkcji eval:

var strJSON = '{"result":true,"count":1}';
var objJSON = eval("(function(){return " + strJSON + ";})()");
alert(objJSON.result);
alert(objJSON.count);

Jeśli kontrolujesz, z jakiej przeglądarki korzystasz lub nie martwisz się starszą przeglądarką, zawsze możesz skorzystać z metody JSON.parse.

To naprawdę idealne rozwiązanie na przyszłość.


91
2018-02-08 16:46



Wielki człowiek! Nie mogłem zaimportować biblioteki JSON, ponieważ kolidowało to z innymi bibliotekami - Tahir Malik
eval () jest w porządku, aby spełnić zadanie, podczas gdy może skompilować i wykonać dowolny program JavaScript, więc może być Problemy z bezpieczeństwem. Myślę, że JSON.parse () jest lepszym wyborem. - ray6080
Uwaga dla przechodnia: Oto dobre narzędzie online do sprawdzenia, czy Twój ciąg JSON jest poprawny: jsonlint.com - Amal Murali
NIE NIE NIE!!! Używanie eval do oceny JSON to naprawdę niebezpieczny pomysł. Czy jesteś w 100% pewien, że nie ma możliwości, aby ktoś mógł wprowadzić swój własny kod do łańcucha? - Charles
Warto wspomnieć, że nie ma czegoś takiego jak Obiekt JSON. - Jezen Thomas


Jeśli otrzymujesz to z zewnętrznej strony, pomocne może być użycie getJSON jQuery. Jeśli jest to lista, możesz ją iterować za pomocą $ .each

$.getJSON(url, function (json) {
    alert(json.result);
    $.each(json.list, function (i, fb) {
        alert(fb.result);
    });
});

49
2017-07-18 21:57





Jeśli chcesz użyć JSON 3 w starszych przeglądarkach możesz je załadować warunkowo za pomocą:

<script>
    window.JSON || 
    document.write('<script src="//cdnjs.cloudflare.com/ajax/libs/json3/3.2.4/json3.min.js"><\/scr'+'ipt>');
</script>

Teraz standard window.JSON obiekt jest dostępny bez względu na to, jakiej przeglądarki używa klient.


32
2018-04-19 18:52



Jest dostępny dla ciebie po json3.min.js zakończyło ładowanie. To nie daje oddzwonienia, gdy jest dostępny. Twój kod może zadziałać dzisiaj, ale nie będzie działał w środę, gdy cdnjs.cloudflare.com nagle zacznie wolniej niż zwykle, albo sieć zostanie załadowana lub będzie to jeden z 10000 innych powodów. Wymagaj JS zamiast. - Peter V. Mørch
Peter, to nie jest poprawne. Zarówno ładowanie zewnętrznych skryptów, jak i document.write są czynnościami synchronicznymi, więc wszystkie skrypty umieszczone po tym będą czekały, aż zostaną załadowane przed wykonaniem. Do ładowania tylko JSON3, jest to dobre podejście. RequireJS przydałby się, gdyby twój projekt stawał się coraz bardziej złożony i musiał ładować skrypty ze złożonymi zależnościami zależności. Pamiętaj tylko, że document.write zablokuje renderowanie strony, więc umieść go na dole znaczników. - huwiler
Przepraszam; Myślę, że masz rację. Proszę pomiń mój komentarz jako fałszywy. - Peter V. Mørch
Peter, twój pierwszy komentarz jest informacyjny i użyteczny (dobrze mieć to ostrzeżenie), po prostu nie dotyczy w 100% przypadków. Dla nieco bardziej stabilnego i szybszego CDN możesz użyć jsDelivr: //cdn.jsdelivr.net/json3/latest/json3.min.js - tomByrer


Poniższy przykład wyjaśnia:

var jsontext   = '{"name":"x","age":"11"}';
var getContact = JSON.parse(jsontext);
document.write(getContact.name + ", " + getContact.age);

// Output: x, 11

LUB

Możesz także użyć eval funkcjonować. Poniższy przykład używa programu eval funkcjonować:

var jsontext   = '{"name":"x","age":"11"}';
var getContact = eval('(' + jsontext + ')');
document.write(getContact.name + ", " + getContact.age);

// Output: x, 11

Od JSON.parse funkcja jest bezpieczniejsza i działa szybciej niż funkcja eval, polecam Ci jej użyć JSON.parse funkcjonować.


31
2017-10-01 07:42





Jeśli przekazujesz zmienną łańcuchową (dobrze sformatowany ciąg JSON) do JSON.parse z MVC @Viewbag, która ma podwójne cytowanie, "" ", tak jak w cudzysłowie, musisz przetworzyć je przed JSON.parse (jsonstring)

    var jsonstring = '@ViewBag.jsonstring';
    jsonstring = jsonstring.replace(/&quot;/g, '"');  

25
2017-10-22 15:06



Co masz na myśli mówiąc o tym? Dlaczego publikujesz odpowiedź na starożytne pytanie? - kay
To, co powiedzieli w poprzednich odpowiedziach, nie pomaga w przypadku, gdy wartość parametru ma podwójne cudzysłowy w łańcuchu. Należy go zastąpić globalnie prawdziwą podwójną kwotą !! Dowiedziałem się w bardzo trudny sposób, by podzielić się tym, że ktoś ma ten sam problem - Jenna Leaf
Kay: W tej chwili wyjaśniłem moje posty, to pierwszy raz, kiedy próbowałem pomóc. Ponownie sprawdź księgowanie. Wiesz, że cytowanie danych wyjściowych ze strony serwera jest prawdziwym problemem dla JSON.parse (). - Jenna Leaf


Możesz użyć funkcji eval, jak w niektórych innych odpowiedziach. (Nie zapomnij o dodatkowych nawiasach klamrowych.) Będziesz wiedzieć dlaczego, kiedy będziesz kopać głębiej) lub po prostu użyj funkcji jQuery parseJSON:

var response = '{"result":true , "count":1}'; 
var parsedJSON = $.parseJSON(response);

LUB

Możesz użyć tego poniżej kodu.

var response = '{"result":true , "count":1}';
var jsonObject = JSON.parse(response);

I możesz uzyskać dostęp do pól za pomocą jsonObject.result i jsonObject.count.


24
2018-06-06 03:51



jsonObject.count w konsoli. log zwraca wartość undefined. Jak mam to nazwać? - Sahar Ch.


Najłatwiejszy sposób użycia parse() metoda:

var response = '{"a":true,"b":1}';
var JsonObject= JSON.parse(response);

to jest przykład jak uzyskać wartości:

var myResponseResult = JsonObject.a;
var myResponseCount = JsonObject.b;

23
2018-06-04 14:44





Bez użycia biblioteki możesz użyć eval - jedyny czas, którego powinieneś użyć. Bezpieczniej jest jednak korzystać z biblioteki.

na przykład...

var response = '{"result":true , "count":1}';

var parsedJSON = eval('('+response+')');

var result=parsedJSON.result;
var count=parsedJSON.count;

alert('result:'+result+' count:'+count);

19
2018-02-08 16:45



eval cant obsługuje łańcuch json, który zwraca się jako HTML - user192344
JEŚLI jest kodowany html, nie jest już JSON. - ThiefMaster♦
eval oczekuje poprawnego javascript, którego JSON może nie być, więc eval nie może parsować ważnych tekstów JSON (na przykład U + 2028 jest poprawny w JSON, nieważny w javascript). - Marc Lehmann