Jak mam przeanalizować JSON za pomocą Node.js? Czy jest jakiś moduł, który bezpiecznie zweryfikuje i parsuje JSON?
javascript
json
node.js
Tikhon Jelvis
źródło
źródło
możesz wymagać plików .json.
Na przykład, jeśli
config.json
plik znajduje się w tym samym katalogu, co plik kodu źródłowego, należy użyć:lub (rozszerzenie pliku można pominąć):
zauważ, że
require
jest synchroniczny i czyta plik tylko raz , kolejne wywołania zwracają wynik z pamięci podręcznejPamiętaj również, że powinieneś używać tego tylko do plików lokalnych pod twoją absolutną kontrolą, ponieważ potencjalnie wykonuje on dowolny kod w pliku.
źródło
require
jest synchroniczny. Jeślifs.readFile
zamiast tego chcesz zsynchronizować przyjazne użycieJSON.parse
.json
rozszerzenia! Jeśli twój plik NIE ma.json
rozszerzenia, polecenie wymaga nie będzie traktować go jako pliku json.Możesz użyć
JSON.parse()
.Powinieneś być w stanie używać tego
JSON
obiektu w dowolnej implementacji JavaScript kompatybilnej z ECMAScript 5 . I V8 , na którym zbudowano Node.js, jest jednym z nich.Analizowanie ciągu zawierającego dane JSON
Analizowanie pliku zawierającego dane JSON
Będziesz musiał wykonać kilka operacji na plikach za pomocą
fs
modułu.Wersja asynchroniczna
Wersja synchroniczna
Chcesz użyć
require
? Pomyśl jeszcze raz!Czasami możesz użyć
require
:Ale nie polecam tego z kilku powodów:
require
jest synchroniczny. Jeśli masz bardzo duży plik JSON, dusi on twoją pętlę zdarzeń. Naprawdę trzeba korzystaćJSON.parse
zfs.readFile
.require
odczyta plik tylko raz . Kolejne wywołaniarequire
tego samego pliku zwrócą kopię z pamięci podręcznej. Nie jest to dobry pomysł, jeśli chcesz czytać.json
plik, który jest stale aktualizowany. Możesz użyć hacka . Ale w tym momencie łatwiej jest po prostu użyćfs
..json
rozszerzenia,require
nie będzie traktować zawartości pliku jako JSON.Poważnie! Zastosowanie
JSON.parse
.load-json-file
modułJeśli czytasz dużą liczbę
.json
plików (i jesteś wyjątkowo leniwy), pisanie kodu bojlera za każdym razem staje się denerwujące. Możesz zapisać niektóre znaki za pomocąload-json-file
modułu.Wersja asynchroniczna
Wersja synchroniczna
Przetwarzanie JSON ze strumieni
Jeśli zawartość JSON jest przesyłana strumieniowo przez sieć, musisz użyć analizatora składni JSON przesyłanego strumieniowo. W przeciwnym razie spowoduje to powiązanie procesora i uduszenie pętli zdarzeń do momentu pełnego przesłania treści JSON.
W tym celu dostępnych jest wiele pakietów w NPM . Wybierz to, co dla Ciebie najlepsze.
Obsługa błędów / bezpieczeństwo
Jeśli nie masz pewności, czy cokolwiek, co jest przekazywane,
JSON.parse()
jest poprawnym JSON , upewnij się, że dołączasz wywołanie doJSON.parse()
wewnątrztry/catch
bloku. Podany przez użytkownika ciąg JSON może spowodować awarię aplikacji, a nawet doprowadzić do luk w zabezpieczeniach. Upewnij się, że obsługa błędów jest wykonywana, jeśli analizujesz JSON podany zewnętrznie.źródło
and could even lead to security holes
z ciekawości, jak?<script>...
, a błąd został przelany na stronę klienta, masz tam błąd XSS. Dlatego IMO jest ważne, aby obsługiwać błędy JSON dokładnie tam, gdzie je analizujesz.require
JSON?” i nawet nie zawracał sobie głowy dokumentowaniem skutków ubocznych. Oznaczało to również, że wymagany akceptuje pliki w dwóch językach: JavaScript i JSON (nie, nie są takie same). Tyle o SRP.użyj obiektu JSON :
źródło
Kolejny przykład JSON.parse:
źródło
Chciałbym wspomnieć, że istnieją alternatywy dla globalnego obiektu JSON.
JSON.parse
iJSON.stringify
oba są synchroniczne, więc jeśli chcesz radzić sobie z dużymi obiektami, możesz chcieć sprawdzić niektóre asynchroniczne moduły JSON.Zobacz: https://github.com/joyent/node/wiki/Modules#wiki-parsers-json
źródło
JSON.parse
całą aplikację ulegnie awarii lub, przy użyciuprocess.on('uncaughtException', function(err) { ... });
, ostatecznie nie będzie szansy na wysłanie użytkownikowi błędu „źle zniekształcony JSON”.async
parser? Nie znalazłem tego.Dołącz
node-fs
bibliotekę.Aby uzyskać więcej informacji na temat biblioteki „fs”, zapoznaj się z dokumentacją pod adresem http://nodejs.org/api/fs.html
źródło
Ponieważ nie wiesz, że Twój ciąg jest rzeczywiście prawidłowy, postawiłbym go na pierwszym miejscu w próbach catch. Ponieważ bloki try catch nie są zoptymalizowane według węzłów, chciałbym umieścić całą tę funkcję w innej funkcji:
LUB w „stylu asynchronicznym”
źródło
Analizujesz strumień JSON? Zastosowanie
JSONStream
.https://github.com/dominictarr/JSONStream
źródło
Wszyscy tutaj opowiadali o JSON.parse, więc pomyślałem o czymś innym. Istnieje świetny moduł Połącz z wieloma oprogramowaniem pośredniczącym, aby ułatwić i usprawnić tworzenie aplikacji. Jednym z programów pośrednich jest bodyParser . Analizuje JSON, formularze HTML itp. Istnieje również specyficzne oprogramowanie pośrednie do analizowania JSON tylko noop .
Spójrz na powyższe linki, może to być naprawdę pomocne.
źródło
To wszystko.
źródło
jak wspomniano w innych odpowiedziach, prawdopodobnie potrzebujesz albo lokalnego pliku json, o którym wiesz, że jest bezpieczny i obecny, jak plik konfiguracyjny:
lub użyć globalnego obiektu JSON do parsowania wartości ciągu na obiekt:
zwróć uwagę, że gdy potrzebujesz pliku, jego zawartość jest oceniana, co stwarza zagrożenie bezpieczeństwa w przypadku, gdy nie jest to plik json, ale plik js.
tutaj opublikowałem demo, w którym możesz zobaczyć obie metody i grać z nimi online (przykład parsowania znajduje się w pliku app.js - następnie kliknij przycisk Uruchom i zobacz wynik w terminalu): http: // staging1 .codefresh.io / labs / api / env / json-parse-example
możesz zmodyfikować kod i zobaczyć wpływ ...
źródło
Używasz JSON do konfiguracji z Node.js? Przeczytaj to i zdobądź umiejętności konfiguracyjne ponad 9000 ...
Odpowiednie aplikacje są dostępne w ponad 3 warstwach konfiguracji:
Większość programistów traktuje konfigurację serwera i aplikacji tak, jakby mogła się zmienić. Nie może Możesz nakładać na siebie zmiany z wyższych warstw, ale modyfikujesz wymagania podstawowe . Niektóre rzeczy muszą istnieć! Spraw, by twoja konfiguracja zachowywała się tak, jakby była niezmienna, ponieważ niektóre z nich są po prostu, podobnie jak kod źródłowy.
Brak dostrzeżenia, że wiele rzeczy nie zmieni się po uruchomieniu, prowadzi do anty-wzorców, takich jak zaśmiecanie konfiguracji ładowaniem blokami try / catch i udawanie, że możesz kontynuować bez poprawnie skonfigurowanej aplikacji. Nie możesz Jeśli możesz, należy do warstwy konfiguracji społeczności / użytkowników, a nie warstwy konfiguracji serwera / aplikacji. Po prostu źle to robisz. Opcjonalne elementy należy nakładać warstwami na wierzch, gdy aplikacja zakończy ładowanie.
Przestań walić głową w ścianę: Twoja konfiguracja powinna być bardzo prosta .
Zobacz, jak łatwo jest skonfigurować coś tak złożonego, jak platforma usługowa niezależna od protokołu i od źródła danych przy użyciu prostego pliku konfiguracyjnego json i prostego pliku app.js ...
container-config.js ...
index.js ... (silnik, który napędza wszystko)
app.js ... (kod, który zasila twoją usługę agnostyczną niezależną od protokołu i źródła danych)
Korzystając z tego wzorca, możesz teraz załadować elementy konfiguracji społeczności i użytkowników na uruchomioną aplikację, programista jest gotowy, aby wrzucić twoją pracę do kontenera i skalować. Jesteś czytany za multitenanta. Userland jest odizolowany. Możesz teraz rozdzielić obawy dotyczące używanego protokołu usługi, używanego typu bazy danych i skoncentrować się na pisaniu dobrego kodu.
Ponieważ używasz warstw, można polegać na jednym źródle prawdy za wszystko, w dowolnym momencie (warstwowy obiektu config) i kontroli błędów unikać na każdym kroku, martwiąc się o „O cholera, jak mam zamiar zrobić to pracować bez odpowiedniej konfiguracji?!? ".
źródło
Moje rozwiązanie:
źródło
TypeError: path must be a string or Buffer
błędy - jakiś pomysł, od czego zacząć debugowanie tego problemu?Po prostu chcę uzupełnić odpowiedź (ponieważ zmagałem się z nią przez chwilę), chcę pokazać, jak uzyskać dostęp do informacji json, ten przykład pokazuje dostęp do tablicy Json:
źródło
Aby uczynić to tak skomplikowanym, jak to możliwe i przynieść jak najwięcej paczek, jak to możliwe ...
Pozwala to na:
Lub jeśli używasz asynchronizacji / czekaj:
Zaletą
readFileSync
tego jest fakt, że serwer Node może przetwarzać inne żądania podczas odczytywania pliku z dysku.źródło
JSON.parse nie zapewni bezpieczeństwa analizowanego ciągu json. Powinieneś spojrzeć na bibliotekę taką jak json-safe-pars lub podobną bibliotekę.
Ze strony json-safe-parse npm:
źródło
Wykorzystaj funkcję prób Lodash, aby zwrócić obiekt błędu, który możesz obsłużyć za pomocą funkcji isError.
źródło
.bind
zamiast po prostu używać _.attempt (JSON.parse, str)Zawsze upewnij się, że używasz JSON.parse w try catch catch , ponieważ węzeł zawsze generuje nieoczekiwany błąd, jeśli masz jakieś uszkodzone dane w swoim jsonie, więc użyj tego kodu zamiast prostego JSON.Parse
źródło
Jeśli chcesz dodać kilka komentarzy do swojego JSON i zezwolić na przecinki końcowe, możesz użyć poniższej implementacji:
Pamiętaj, że może nie działać dobrze, jeśli masz coś takiego
"abc": "foo // bar"
w swoim JSON. Więc YMMV.źródło
Jeśli plik źródłowy JSON jest dość duży, warto rozważyć trasę asynchroniczną za pomocą natywnego asynchronizacji / oczekiwania na Node.js 8.0 w następujący sposób
źródło
Używam fs-extra . Bardzo mi się podoba, ponieważ - choć obsługuje oddzwanianie - obsługuje także obietnice . Pozwala mi to po prostu napisać kod w znacznie bardziej czytelny sposób:
Ma również wiele przydatnych metod, które nie są dostarczane wraz ze standardowym
fs
modułem, a ponadto łączy je zfs
modułem macierzystym i obiecuje.To w zasadzie wszystkie zalety. Mam nadzieję, że inni uznają to za przydatne.
źródło
Jeśli chcesz parsować JSON z Node.js w bezpieczny sposób (aka: użytkownik może wprowadzać dane lub publiczny interfejs API) sugerowałbym użycie bezpiecznego parsowania .
Użycie jest jak domyślne,
JSON.parse
ale ochroni Twój kod przed:źródło
Możesz użyć JSON.parse () (która jest wbudowaną funkcją, która prawdopodobnie zmusi cię do zawinięcia jej instrukcjami try-catch).
Lub użyj biblioteki JSON do analizowania npm, na przykład json-parse-or
źródło
Użyj tego, aby być po bezpiecznej stronie
źródło
NodeJs jest serwerem opartym na JavaScript , więc możesz robić to tak, jak w czystym JavaScript ...
Wyobraź sobie, że to Json w NodeJs ...
Możesz to zrobić powyżej, aby uzyskać parsowaną wersję swojego jsona ...
źródło
Jak wspomniano w powyższych odpowiedziach, możemy użyć
JSON.parse()
do parsowania napisów do JSON. Ale przed parsowaniem upewnij się, że parsujesz poprawne dane, w przeciwnym razie może to doprowadzić do awarii całej aplikacjimożna go bezpiecznie używać w ten sposób
źródło
Zastosowanie
JSON.parse(str);
. Przeczytaj więcej na ten temat tutaj .Oto kilka przykładów:
źródło
Nie są wymagane żadne dodatkowe moduły.
Po prostu użyj.
var parsedObj = JSON.parse(yourObj);
Nie sądzę, żeby były z tym jakieś problemy związane z bezpieczeństwem
źródło
To proste, możesz przekonwertować JSON na ciąg za pomocą
JSON.stringify(json_obj)
i przekonwertować ciąg na JSON za pomocąJSON.parse("your json string")
.źródło