Mam ciąg w aplikacji serwera Java, do której można uzyskać dostęp za pomocą AJAX. Wygląda mniej więcej tak:
var json = [{
"adjacencies": [
{
"nodeTo": "graphnode2",
"nodeFrom": "graphnode1",
"data": {
"$color": "#557EAA"
}
}
],
"data": {
"$color": "#EBB056",
"$type": "triangle",
"$dim": 9
},
"id": "graphnode1",
"name": "graphnode1"
},{
"adjacencies": [],
"data": {
"$color": "#EBB056",
"$type": "triangle",
"$dim": 9
},
"id": "graphnode2",
"name": "graphnode2"
}];
Czy po wyciągnięciu łańcucha z serwera istnieje prosty sposób, aby przekształcić go w żywy obiekt JavaScript (lub tablicę)? Czy też muszę ręcznie podzielić ciąg i ręcznie zbudować obiekt?
Odpowiedzi:
Obsługa nowoczesnych przeglądarek
JSON.parse()
.W przeglądarkach, które nie można dołączyć do
json2
biblioteki .źródło
Cały sens JSON polega na tym, że ciągi JSON można konwertować na obiekty rodzime bez robienia czegokolwiek. Sprawdź ten link
Można użyć jednej
eval(string)
lubJSON.parse(string)
.Jest to jednak
eval
ryzykowne. Z json.org:źródło
Rób jak jQuery! (esencja)
W ten sposób nie potrzebujesz żadnej zewnętrznej biblioteki i nadal działa ona na starych przeglądarkach.
źródło
eval()
.Aby zebrać wszystkie elementy tablicy i zwrócić obiekt Json
Aby przeanalizować te same dane, przez które przechodzimy w ten sposób
źródło
Możesz również użyć,
eval()
aleJSON.parse()
jest to bezpieczniejszy i łatwiejszy sposób, więc dlaczego miałbyś?dobrze i działa
Nie widzę żadnego powodu, dla którego wolałbyś skorzystać
eval
. To tylko zagraża twojej aplikacji.To powiedziawszy - jest to również możliwe.
źle - ale też działa
Dlaczego jest
eval
to zły pomysł?Rozważ następujący przykład.
Niektóre strony trzecie lub użytkownik podali dane ciągu JSON.
Skrypt po stronie serwera przetwarza te dane.
Używanie
JSON.parse
:rzuci:
Funkcja nie zostanie wykonana.
Jesteś bezpieczny.
Używanie
eval()
:wykona funkcję i zwróci tekst.
Jeśli zamienię tę nieszkodliwą funkcję na tę, która usuwa pliki z folderu witryny, zostałeś zhakowany. W tym przykładzie nie zostaną zgłoszone żadne błędy / ostrzeżenia.
NIE jesteś bezpieczny.
Byłem w stanie manipulować ciągiem tekstowym JSON, więc działa on jako funkcja, która zostanie wykonana na serwerze.
eval(JSON)[0].adjacencies[0].nodeTo
oczekuje przetworzenia ciągu JSON, ale w rzeczywistości właśnie wykonaliśmy funkcję na naszym serwerze.Można temu zapobiec, jeśli po stronie serwera sprawdzimy wszystkie dane dostarczone przez użytkownika przed przekazaniem ich do
eval()
funkcji, ale dlaczego nie skorzystać z wbudowanego narzędzia do analizy JSON i uniknąć wszystkich problemów i niebezpieczeństw?źródło
A jeśli chcesz, aby zdejrializowany obiekt miał również funkcje, możesz użyć mojego małego narzędzia: https://github.com/khayll/jsmix
źródło
Jeśli wkleisz ciąg po stronie serwera do html, nie musisz nic robić:
Dla zwykłego języka Java w jsp:
Dla rozpórek szerokości jsp:
źródło
Myślę, że to powinno pomóc:
Dokumentacje również dowodzą, że można użyć wymaganego () pliku Json: https://www.bennadel.com/blog/2908-you-can-use-require-to-load-json-javascript-object-notation-files -in-node-js.htm
źródło