Podczas ręcznego generowania obiektu lub tablicy JSON często łatwiej jest pozostawić przecinek końcowy na ostatnim elemencie w obiekcie lub tablicy. Na przykład kod wyjściowy z tablicy ciągów może wyglądać (w pseudokodzie typu C ++):
s.append("[");
for (i = 0; i < 5; ++i) {
s.appendF("\"%d\",", i);
}
s.append("]");
dając ci ciąg jak
[0,1,2,3,4,5,]
Czy to jest dozwolone?
alert([1, 2, 3, ].length)
wyświetli „4”.Odpowiedzi:
Niestety specyfikacja JSON nie pozwala na przecinek końcowy. Istnieje kilka przeglądarek, które na to pozwolą, ale ogólnie musisz martwić się o wszystkie przeglądarki.
Ogólnie staram się odwrócić problem i dodać przecinek przed rzeczywistą wartością, aby uzyskać kod wyglądający następująco:
Ta dodatkowa linia kodu w pętli for nie jest droga ...
Inną alternatywą, której użyłem, gdy wypisałem strukturę do JSON ze słownika jakiejś formy, jest zawsze dodawanie przecinka po każdym wpisie (jak to robisz powyżej), a następnie dodanie fikcyjnego wpisu na końcu, który nie ma przecinka (ale to jest po prostu leniwe; ->).
Niestety nie działa dobrze z tablicą.
źródło
if
s, aby uniknąć tego głupiego małego przecinka. O kosztowności YMMV, zobacz to na przykład jsfiddle.net/oriadam/mywL9384 Wyjaśnienie: Twoje rozwiązanie jest świetne, po prostu nienawidzę specyfikacji, które zabraniają przecinku końcowego.Nie. Specyfikacja JSON, utrzymywana na stronie http://json.org , nie zezwala na końcowe przecinki. Z tego, co widziałem, niektóre parsery mogą po cichu na to pozwolić podczas czytania łańcucha JSON, podczas gdy inne będą zgłaszać błędy. Aby zapewnić interoperacyjność, nie należy go uwzględniać.
Powyższy kod można zrestrukturyzować, aby usunąć przecinek końcowy podczas dodawania terminatora tablicowego lub dodać przecinek przed elementami, pomijając ten dla pierwszego.
źródło
Prosty, tani, łatwy do odczytania i zawsze działa niezależnie od specyfikacji.
Nadmiarowe przypisanie do $ delim to bardzo niewielka cena do zapłaty. Działa równie dobrze, jeśli nie ma wyraźnej pętli, ale oddzielne fragmenty kodu.
źródło
if
jest łatwiejszy do uchwycenia. Ale dziękuję za udostępnienie.for(let ..., sep=""; ... ; sep=",") { ...
Końcowe przecinki są dozwolone w JavaScript, ale nie działają w IE. Specyfikacja JSON Douglasa Crockforda bez wersji nie pozwalała na to, a ponieważ nie była wersją, nie powinno się to zmieniać. Specyfikacja ESS JSON zezwala na to jako rozszerzenie, ale RFC 4627 Crockforda nie, a ES5 powrócił do ich niedozwolenia. Firefox poszedł w ich ślady. Internet Explorer jest powodem, dla którego nie możemy mieć fajnych rzeczy.
źródło
Jak już powiedziano, specyfikacja JSON (oparta na ECMAScript 3) nie pozwala na przecinek końcowy. ES> = 5 pozwala na to, więc możesz używać tej notacji w czystym JS. Dyskutowano o tym, a niektóre parsery to poparły ( http://bolinfest.com/essays/json.html , http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas- nie jest już akceptowany / ), ale faktem jest (jak pokazano na http://json.org/ ), że nie powinien on działać w JSON. Ta rzecz powiedziała ...
... Zastanawiam się, dlaczego nikt nie zauważył, że można podzielić pętlę na iteracji na 0. i użyć przecinka wiodącego zamiast końcowego, aby pozbyć się zapachu kodu porównania i rzeczywistego obciążenia wydajności w pętli, co powoduje kod, który w rzeczywistości jest krótszy, prostszy i szybszy (z powodu braku rozgałęzień / warunków w pętli) niż inne proponowane rozwiązania.
Np. (W pseudokodzie w stylu C podobnym do kodu proponowanego przez OP):
źródło
Koderzy PHP mogą chcieć sprawdzić implode () . To zajmuje tablicę łączy ją za pomocą łańcucha.
Z dokumentów ...
źródło
Co ciekawe, zarówno C, jak i C ++ (i myślę, że C #, ale nie jestem pewien) zezwalają na przecinek końcowy - właśnie z podanego powodu: znacznie ułatwia programowe generowanie list. Nie jestem pewien, dlaczego JavaScript nie poszedł w ich ślady.
źródło
Użyj JSON5. Nie używaj JSON.
http://json5.org/
https://github.com/aseemk/json5
źródło
Istnieje możliwy sposób uniknięcia gałęzi if w pętli.
źródło
Zgodnie ze specyfikacją klasy JSONArray :
Tak więc, jak rozumiem, należy napisać:
Ale może się zdarzyć, że niektóre parsery zwrócą liczbę 7 jako liczbę przedmiotów (jak IE8, jak zauważył Daniel Earwicker) zamiast oczekiwanej liczby 6.
Edytowane:
Znalazłem ten walidator JSON, który sprawdza poprawność łańcucha JSON względem RFC 4627 (typ nośnika aplikacji / json dla notacji obiektowej JavaScript) i specyfikacji języka JavaScript. W rzeczywistości tablica z przecinkiem końcowym jest uważana za prawidłową tylko dla JavaScript, a nie dla specyfikacji RFC 4627.
Jednak w specyfikacji RFC 4627 stwierdzono, że:
Dla mnie to znowu problem interpretacyjny. Jeśli napiszesz, że elementy są oddzielone przecinkami (nie mówiąc o specjalnych przypadkach, takich jak ostatni element), można to zrozumieć na dwa sposoby.
PS RFC 4627 nie jest standardem (jak wyraźnie zaznaczono) i jest już przestarzały w RFC 7159 (który jest proponowanym standardem) RFC 7159
źródło
value-separator
bezvalue
tuż obok niego. Również tekst jest bardzo konkretny. „Rozdzielanie wartości” można zastosować tylko wtedy, gdy istnieje wiele wartości. Więc jeśli masz dwie wartości obok siebie, są one oddzielane przecinkiem. Jeśli masz jedną wartość (lub jeśli patrzysz tylko na wartość na końcu), nie ma podziału, a więc przecinka.Z moich wcześniejszych doświadczeń wynika, że różne przeglądarki inaczej radzą sobie z przecinkami w JSON.
Zarówno Firefox, jak i Chrome radzą sobie dobrze. Ale IE (wszystkie wersje) wydaje się pękać. Mam na myśli naprawdę zerwanie i przestanie czytać resztę skryptu.
Mając to na uwadze, a także fakt, że zawsze miło jest pisać zgodny kod, proponuję poświęcić dodatkowy wysiłek, aby upewnić się, że nie ma przecinka końcowego.
:)
źródło
Prowadzę bieżącą liczbę i porównuję ją z całkowitą liczbą. Jeśli bieżąca liczba jest mniejsza niż całkowita liczba, wyświetlam przecinek.
Może nie działać, jeśli nie masz łącznej liczby przed wykonaniem generacji JSON.
Z drugiej strony, jeśli używasz PHP 5.2.0 lub nowszego, możesz po prostu sformatować swoją odpowiedź za pomocą wbudowanego API JSON.
źródło
Z Relaxed JSON możesz mieć przecinki końcowe lub po prostu je pominąć . Są opcjonalne.
Nie ma żadnego powodu, aby parsować dokument podobny do JSON.
Spójrz na specyfikację Relaxed JSON, a zobaczysz, jak „głośna” jest oryginalna specyfikacja JSON. Zbyt wiele przecinków i cytatów ...
http://www.relaxedjson.org
Możesz także wypróbować swój przykład za pomocą tego internetowego analizatora składni RJSON i zobaczyć, jak został poprawnie przeanalizowany.
http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D
źródło
json object
użyciaJSON.parse
lub przez bibliotekę używającąRJSON.parse
. Zgodziłbym się z tobą, gdyby źródłem był obiekt, ale tutaj tak nie jest. Nie widzę, gdzie w pytaniu w ogóle wspominadownstream
o zużyciu obiektu lub ciągu.Zwykle zapętlam tablicę i dołączam przecinek po każdym wpisie w ciągu. Po pętli ponownie usuwam ostatni przecinek.
Może nie najlepszy sposób, ale mniej kosztowny niż sprawdzanie za każdym razem, czy to ostatni obiekt w pętli.
źródło
Nie jest to zalecane, ale nadal możesz zrobić coś takiego, aby to przeanalizować.
źródło
Ponieważ pętla for służy do iteracji po tablicy lub podobnej iterowalnej strukturze danych, możemy użyć długości tablicy, jak pokazano,
W pliku datafile.txt zawierającym
źródło
Jak stwierdzono, nie jest to dozwolone. Ale w JavaScript jest to:
(działa dobrze w Firefox, Chrome, Edge, IE11 i bez let w IE9, 8, 7, 5)
źródło