Część odpowiedzi JSON witryny miała to (... dodane dla kontekstu):
{..., now:function(){return(new Date).getTime()}, ...}
Czy dodanie anonimowych funkcji do JSON jest prawidłowe? Spodziewałbym się, że za każdym razem, gdy uzyskasz dostęp do „czasu”, zwrócisz inną wartość.
json
anonymous-function
Zachary Scott
źródło
źródło
JSON.parse('{now:function(){return(new Date).getTime()}')
. Inspektor mówi:Uncaught SyntaxError: Unexpected token n
Szybkie spojrzenie na specyfikację JSON potwierdza to. Skoncentruj się na sekcji „wartość”.Odpowiedzi:
Nie.
JSON ma służyć wyłącznie jako język opisu danych. Jak zauważono na http://www.json.org , jest to „lekki format wymiany danych”. - nie jest językiem programowania.
Na http://en.wikipedia.org/wiki/JSON obsługiwane są „typy podstawowe”:
null
źródło
a==null?1:a.toString()==""
co to robi to mówi, że jeśli a = null to zwraca 1 / true, jeśli jest "" oznacza pusty ciąg, otrzymujesz również 1 / true .. jeśli tak jest nie null lub „”, to zwróci 0 / false, możesz powtórzyć to więcej, aby pracować z [] i {} po prostu dodać?1:a==[]?1:a.toString()=={}.toString();
do mojego poprzedniego fragmentu. więc może ta funkcja ci pomoże.isnull=(function(a){return (a==null?1:a.toString()==""?1:a==[]?1:a.toString()=={}.toString())?true:false})
Chciałbym używać?1:0
zamiast?true:false
ale (prawda / fałsz)Problem polega na tym, że JSON jako język definicji danych wyewoluował z JSON jako notacja obiektu JavaScript. Ponieważ Javascript obsługuje eval w JSON, uzasadnione jest umieszczenie kodu JSON wewnątrz JSON (w tym przypadku użycia). Jeśli używasz JSON do zdalnego przekazywania danych, to powiedziałbym, że umieszczanie metod w JSON jest złą praktyką, ponieważ być może nie wymodelowałeś dobrze interakcji klient-serwer. Ponadto, gdy chciałbyś używać JSON jako języka opisu danych, powiedziałbym, że możesz wpaść w kłopoty, osadzając metody, ponieważ niektóre parsery JSON zostały napisane z myślą tylko o opisie danych i mogą nie obsługiwać definicji metod w strukturze.
Wpis w Wikipedii JSON jest dobrym argumentem za pominięciem metod w formacie JSON, powołując się na obawy dotyczące bezpieczeństwa:
źródło
Zacytujmy jedną ze specyfikacji - http://tools.ietf.org/html/rfc7159#section-12
The JavaScript Object Notation (JSON) Data Interchange Format Specification stwierdza:
Zatem wszystkie odpowiedzi, które stwierdzają, że funkcje nie są częścią standardu JSON, są poprawne.
Oficjalna odpowiedź brzmi: Nie, nie można definiować funkcji w wynikach JSON!
Odpowiedź mogłaby brzmieć tak, ponieważ „kod to dane” i „dane to kod”. Nawet jeśli JSON jest używany jako format serializacji danych niezależny od języka, tunelowanie „kodu” przez inne typy będzie działać.
Ciąg JSON może służyć do przekazywania funkcji JS do przeglądarki po stronie klienta w celu wykonania.
Prowadzi to do pytań takich jak: Jak „ Wykonać kod JavaScript przechowywany jako ciąg znaków ”.
Bądź przygotowany, aby podnieść flagę „eval () is evil” i przykleić flagę „nie tuneluj funkcji przez JSON” obok niej.
źródło
O ile wiem, nie jest to standardowe. Szybkie spojrzenie na http://json.org/ potwierdza to.
źródło
Nie, zdecydowanie nie.
Jeśli używasz przyzwoitego serializatora JSON, nie pozwoli ci on serializować takiej funkcji. To prawidłowy OBIEKT, ale nieprawidłowy kod JSON. Niezależnie od zamiarów tej witryny, nie wysyła ona prawidłowego formatu JSON.
źródło
JSON jawnie wyklucza funkcje, ponieważ nie ma być strukturą danych tylko w języku JavaScript (pomimo JS w nazwie).
źródło
Krótka odpowiedź brzmi NIE ...
Spójrz na powód, dla którego:
Ale poczekaj ...
Nadal istnieją sposoby na przechowywanie funkcji, powszechnie nie jest to zalecane , ale nadal jest możliwe:
Powiedzieliśmy, że możesz zapisać
string
... a co z konwersją funkcji na łańcuch?Następnie możesz określić dane za pomocą,
JSON.stringify(data)
a następnie za pomocą,JSON.parse
aby je przeanalizować (jeśli ten krok jest potrzebny) ...I eval, aby wykonać funkcję string (zanim to zrobisz, po prostu daj znać, że używanie eval jest niezalecane):
źródło
Używając NodeJS (składnia commonJS) udało mi się uzyskać działanie tego typu funkcji, początkowo miałem tylko strukturę JSON w jakimś zewnętrznym pliku JS, ale chciałem, aby ta struktura była bardziej klasą, z metodami, które można było zdecydować czas pracy.
Deklaracja „Wykonawcy” w myJSON nie jest wymagana.
źródło
Wyrażenia funkcyjne w JSON są całkowicie możliwe, po prostu nie zapomnij zawijać ich w podwójne cudzysłowy. Oto przykład zaczerpnięty z projektu bazy danych noSQL:
źródło
chociaż eval nie jest zalecany, działa to:
źródło
Zostaw cudzysłowy ...
źródło