Konwencja nazewnictwa JSON [zamknięta]

379

Czy istnieje standard nazewnictwa JSON? Widzę większość przykładów, w których wszystkie małe litery są oddzielone podkreśleniem (small_case). Ale czy możesz użyć PascalCase lub camelCase?

GeorgeU
źródło
12
Byłem ciekawy, co wybrali niektórzy liderzy branży. Interfejsy API Twittera i Facebooka używają snake_case, podczas gdy Microsoft i Google używają camelCase.
Justin
2
@Justin, ponieważ Twitter używa Ruby, a Facebook używa PHP. Ruby i PHP zajmują się snake_case. Microsoft i Google dobrze używają odpowiednio C / .NET i Java. Och, właśnie tak. Net i Java mogą być w camelCase. Chodzi o konwencje języków programowania
Abel Callejo,
1
Nie ma standardu, ale konwencją wydaje się być stosowanie standardu technologii systemu odbiorczego.
Martin z Hessle,
1
Wszystkie są poprawne, nie ma rygorystycznej konwencji dla nazw / kluczy w JSON. Chociaż zdecydowanie zalecam unikanie kebab-case, ponieważ nie można uzyskać do niego dostępu za pomocą notacji kropkowej (.) W javascript i należy uzyskać do niej dostęp za pomocą notacji tablicowej [], co moim zdaniem jest uciążliwe.
saurabh
2
Zamknięte jako oparte głównie na opiniach? OP poprosił o fakty dotyczące możliwości / ograniczeń formatu, a nie o czyjąkolwiek opinię. Powiedział „możesz”, a nie „powinieneś”. Być może OP nie napisał tego wystarczająco jasno dla tych pięciu osób, ale musiałbyś mieć słabe rozumienie czytania, aby nie zrozumieć, o co prosi.
dynamichael

Odpowiedzi:

251

Nie ma POJEDYNCZEGO standardu, ale widziałem 3 style, o których wspominasz („Pascal / Microsoft”, „Java” ( camelCase) i „C” (podkreślenia, snake_case)) - a także co najmniej jeden kebab-casepodobny longer-name.

Wydaje się, że zależy to głównie od tego, jakie były tła twórców omawianej usługi; osoby z tłem c / c ++ (lub języki, które przyjmują podobne nazewnictwo, w tym wiele języków skryptowych, ruby ​​itp.) często wybierają wariant podkreślenia; i odpoczywać podobnie (Java vs .NET). Wspomniana biblioteka Jackson, na przykład, przyjmuje konwencję nazewnictwa komponentów Java Bean (camelCase )

AKTUALIZACJA: moja definicja „standardu” to JEDNA konwencja. Tak więc, chociaż można powiedzieć „tak, istnieje wiele standardów”, dla mnie istnieje wiele Naming Conventions, z których żaden nie jest ogólnie „standardem”. Jeden z nich można uznać za standard dla konkretnej platformy, ale biorąc pod uwagę, że JSON jest używany do współdziałania między platformami, które mogą, ale nie muszą mieć większego sensu.

StaxMan
źródło
4
Trzymanie się tła deweloperów jest ważne, ale JSON trzyma się standardu Javascript. Twoje pierwsze stwierdzenie nie jest całkiem poprawne. Ale zdecydowanie trzymaj się konwencji nazewnictwa twojego zespołu.
Anubian Noob
8
Interesujące byłoby zobaczenie niektórych statystyk, ponieważ istnieje ciągłe tarcie między ludźmi, którzy twierdzą, że istnieje połączenie między JSON a JavaScript (poza zwykłym dziedzictwem historycznym), a tymi, którzy myślą, że niewiele obecnie łączy JSON z Javascriptem. Należę do tego ostatniego obozu. Byłbym jednak zainteresowany poznaniem względnych wzorców użytkowania.
StaxMan,
@StaxMan C # w większości przypadków używa PascalCase, a nie camelCase.
ArtOfCode,
@ArtOfCode tak. O co ci chodzi? (również przypadek
pascala
@StaxMan zastanów się nad zaktualizowaniem swojej odpowiedzi, aby zawierała wzmiankę o Przewodniku po stylu Google
garrettmac,
402

W tym dokumencie Przewodnik po stylu Google JSON (zalecenia dotyczące tworzenia interfejsów API JSON w Google),

Zaleca:

  1. Nazwy właściwości muszą być wielbłądami , ciągami ASCII.

  2. Pierwszym znakiem musi być litera, znak podkreślenia (_) lub znak dolara ($).

Przykład:

{
  "thisPropertyIsAnIdentifier": "identifier value"
}

Mój zespół przestrzega tej konwencji.

Chociaż
źródło
8
Najwyraźniej Google zmieniło wytyczne, nic nie można znaleźć na temat wielbłąda lub zaczynając od litery, _ lub $ w dokumencie ...
TheEye
32
@ TheEye Nadal tam jest, wystarczy kliknąć menu rozwijane.
gdw2,
5
Dobre oko, @ gdw2. Dla innych osób w przyszłości będzie to możliwe, jeśli klikniesz przycisk strzałki obok Property Name Guidelines->Property Name Format->Choose meaningful property names..
Panzercrisis,
3
Czy ktoś może wyjaśnić, dlaczego i kiedy użyjesz podkreślenia do prefiksu nazwy właściwości? Przydałoby się odniesienie, a nie tylko opinia.
Sean Glover
4
powoływanie się na Google nie jest odpowiednią odpowiedzią. popierają tylko pewną konwencję / wytyczne i wygląda na to, że Java ma sens, ponieważ są bardzo zorientowani na język Java.
Thomas Andreè Wang
185

Przesłanka

W JSON nie ma standardowego nazewnictwa kluczy . Zgodnie z sekcją Obiekty specyfikacji:

Składnia JSON nie nakłada żadnych ograniczeń na ciągi używane jako nazwy ...

Co oznacza, że camelCase lub snake_case powinny działać poprawnie.

Czynniki napędzające

Nałożenie konwencji nazewnictwa JSON jest bardzo mylące. Można to jednak łatwo zrozumieć, jeśli podzielisz go na części.

  1. Język programowania do generowania JSON

    • Python - snake_case
    • PHP - skrzynka węża
    • Java - camelCase
    • JavaScript - camelCase
  2. Sam JSON nie ma standardowej nazwy kluczy

  3. Język programowania do analizy JSON

    • Python - snake_case
    • PHP - skrzynka węża
    • Java - camelCase
    • JavaScript - camelCase

Dopasuj składniki

  1. Python »JSON» Python - snake_case - jednogłośnie
  2. Python »JSON» PHP - skrzynka węża - jednogłośnie
  3. Python »JSON» Java - snake_case - zobacz problem Java poniżej
  4. Python »JSON» JavaScript - obudowa węża będzie miało sens; i tak przykręć front
  5. Python »JSON» nie wiesz - snake_case będzie miało sens; i tak przekręć parser
  6. PHP »JSON» Python - skrzynka węża - jednogłośnie
  7. PHP »JSON» PHP - skrzynka węża - jednogłośnie
  8. PHP »JSON» Java - skrzynka węża - zobacz problem z Javą poniżej
  9. PHP »JSON» JavaScript - obudowa węża będzie miało sens; i tak przykręć front
  10. PHP »JSON» nie wiesz - snake_case będzie miało sens; i tak przekręć parser
  11. Java »JSON» Python - snake_case - zobacz problem Java poniżej
  12. Java »JSON» PHP - snake_case - zobacz problem Java poniżej
  13. Java »JSON» Java - camelCase - jednogłośnie
  14. Java »JSON» JavaScript - camelCase - jednogłośnie
  15. Java »JSON» nie wiesz - camelCase ma sens; i tak przekręć parser
  16. JavaScript »JSON» Python - snake_case będzie miało sens; i tak przykręć front
  17. JavaScript »JSON» PHP - snake_case będzie miało sens; i tak przykręć front
  18. JavaScript »JSON» Java - camelCase - jednogłośnie
  19. JavaScript »JSON» JavaScript - camelCase - oryginalny

Problem z Javą

snake_case nadal będzie miał sens dla osób z wpisami Java, ponieważ istniejące biblioteki JSON dla Java używają tylko metod dostępu do kluczy zamiast standardowego dot.syntax . Oznacza to, że Java nie zaszkodziłoby tak bardzo dostępowi do kluczy snake_cased w porównaniu z innym językiem programowania, który może wykonywać dot.syntax .

Przykład pakietu Javaorg.json

JsonObject.getString("snake_cased_key")

Przykład pakietu Javacom.google.gson

JsonElement.getAsString("snake_cased_key")

Niektóre rzeczywiste wdrożenia

Wnioski

Wybór odpowiedniej konwencji nazewnictwa JSON dla implementacji JSON zależy od stosu technologii. Są przypadki, w których można użyć snake_case , camelCase lub innej konwencji nazewnictwa.

Inną rzeczą do rozważenia jest waga, jaką należy przypisać generatorowi JSON w porównaniu z parserem JSON i / lub JavaScriptem frontonu. Zasadniczo większą wagę należy położyć na stronie generatora JSON niż po stronie parsera JSON. Wynika to z faktu, że logika biznesowa zwykle znajduje się po stronie generatora JSON.

Ponadto, jeśli strona parsera JSON jest nieznana, możesz zadeklarować, co kiedykolwiek będzie dla ciebie działać.

Abel Callejo
źródło
2
"Person":nie jest camelCase :)
stoft
1
@stoft prawdopodobnie dlatego, że przestrzegali również konwencji schema.org. Rozpoczęcie klucza wielką literą oznacza, że ​​jest to jednostka słownictwa. Rozpoczęcie klawisza małą literą oznacza, że ​​jest to właściwość słownictwa.
Abel Callejo,
2
Nie zgadzam się z tymi pomysłami, po prostu dlatego, że backend Pythona> Frontend Java powinien być camelCase, ale potem dodajesz frontend Pythona i skompromitowałeś backend i jeden frontend. Powinno być tak, jak ma to backend według „standardu”. Parsery frontendu i tak mają łatwiejszą adaptację
Bojan Kogoj
2
Obawiam się tutaj, że istnieje odniesienie do stosu „twojej technologii”. Producent JSON, zwłaszcza jeśli ma być obsługiwany przez serwer HTTP, nie powinien mieć wiedzy o tym, kto go konsumuje ani z jakich powodów. Jeśli JSON jest używany jako metoda komunikacji między wieloma producentami i konsumentami, wówczas stos technologiczny producenta nie powinien być brany pod uwagę.
Robbie Wareham
1
@RobbieWareham Jakoś się z tym zgadzam. Chodzi o to, że „według standardów” nie ma oficjalnej konwencji nazewnictwa. A zatem, może należy wybrać „de facto”, czyli patrzeć na stos technologii. Myślę, że najlepszym sposobem jest zajrzenie do stosu technologii. Spójrz na Facebook, czy historycznie honorowali JavaScript i używali snakeCase? Nie! Zdecydowali się pozostać przy PHP-snake_case.
Abel Callejo
18

Szczególnie w przypadku NodeJS, jeśli pracuję z bazami danych, a moje nazwy pól są rozdzielone podkreśleniem, używam ich również w kluczach struct.

Wynika to z faktu, że pola db mają wiele akronimów / skrótów, więc coś takiego jak appSNSInterfaceRRTest wygląda nieco niechlujnie, ale app_sns_interface_rr_test jest ładniejszy.

W Javascript zmienne są wszystkie camelCase, a nazwy klas (konstruktorów) to ProperCase, więc zobaczysz coś podobnego

var devTask = {
        task_id: 120,
        store_id: 2118,
        task_name: 'generalLedger'
    };

lub

generalLedgerTask = new GeneralLedgerTask( devTask );

I oczywiście w JSON klucze / ciągi znaków są zawinięte w podwójne cudzysłowy, ale wtedy po prostu używasz JSON.stringify i przekazujesz obiekty JS, więc nie musisz się o to martwić.

Walczyłem z tym trochę, dopóki nie znalazłem tego szczęśliwego medium między konwencjami nazewnictwa JSON i JS.

Clarence Liu
źródło
1
to samo tutaj. Odbieranie JSON z snake_case na kliencie z Androidem wygląda niezręcznie !! Również baza danych nie rozróżnia wielkości liter dla nazw kolumn, więc snake_case wydaje się najlepsza dla bazy danych.
mityczny
@mythicalcoder JSON w Javie nie jest nieodłączny w swoim rdzeniu. Java używa tylko pakiety zewnętrzne do analizowania Java np org.json, gson. Odbieranie danych skrzynki węża nie jest tak bardzo bolesne ...JSONObject.get('snake_case_key_here')
Abel Callejo
9

Wydaje się, że istnieje wystarczająca różnorodność, że ludzie robią wszystko, aby umożliwić konwersję ze wszystkich konwencji na inne: http://www.cowtowncoder.com/blog/archives/cat_json.html

W szczególności wspomniany parser Jackson JSON woli bean_naming.

entropo
źródło
5
Drobna korekta: Jackson domyślnie stosuje konwencję nazewnictwa fasoli Java, czyli (niższy) Camel Case beanNaming.
StaxMan
0

Myślę, że JSON nie ma oficjalnej konwencji nazewnictwa, ale możesz śledzić liderów branży, aby zobaczyć, jak to działa.

Google, która jest jedną z największych firm informatycznych na świecie, ma przewodnik w stylu JSON: https://google.github.io/styleguide/jsoncstyleguide.xml

Korzystając z tego, możesz znaleźć przewodnik po innych stylach, który Google definiuje, tutaj: https://github.com/google/styleguide

Filipe Brito
źródło
0

Jak stwierdzili inni, nie ma standardu, więc powinieneś sam go wybrać. W tym celu należy wziąć pod uwagę kilka rzeczy:

  1. Jeśli używasz JavaScript do konsumpcji JSON, to użycie tej samej konwencji nazewnictwa dla właściwości w obu zapewni spójność wizualną i możliwe pewne możliwości czystszego ponownego użycia kodu.

  2. Małym powodem do uniknięcia przypadku kebab jest to, że łączniki mogą wizualnie kolidować ze -znakami wyświetlanymi w wartościach.

    {
      "bank-balance": -10
    }
Dan
źródło
1
snake_case używa podkreślników, a nie myślników.
dostbus 27.07.18