Jaki format JSON jest lepszym wyborem dla par klucz-wartość i dlaczego?
[{"key1": "value1"}, {"key2": "value2"}]
Lub:
[{"Name": "key1", "Value": "value1"}, {"Name": "key2", "Value": "value2"}]
Lub:
{"key1": "value1", "key2": "value2"}
Pierwszy wariant wydaje się bardziej zwarty i „semantycznie znaczący”. Drugi wariant wydaje się bardziej wyrównany, co może pomóc w jego przetworzeniu. Trzeci wariant wydaje się jeszcze bardziej semantyczny.
Pary klucz-wartość zostaną wykorzystane do dołączenia dowolnych danych do innego elementu. Dane muszą być serializowane jako JSON, aby zaokrąglić je przez system.
{"key1": "value1", "key2": "value2"}
?Odpowiedzi:
To, czy wybierzesz pierwszą, czy trzecią opcję, zależy od przypadku użycia. Jeśli modelujesz wiele różnych instancji tego samego rodzaju rzeczy, wybierz pierwszą. Na przykład masz listę osób. Jeśli modelujesz wiele różnych atrybutów jednej rzeczy, wybierz trzecią. Możesz mieć powtarzające się klucze w pierwszym formacie, ale nie w trzecim.
Druga opcja jest okropna i jeszcze nie znalazłem odpowiedniego dla niej przypadku użycia. Powodem, dla którego jest okropny, oprócz tego, że jest bardziej szczegółowy, jest to, że w przypadku JSON na jednym poziomie przerywa automatyczną konwersję większości bibliotek do słownika / mapy. W przypadku głęboko zagnieżdżonego JSON psuje interfejs zapytania podobny do XPath .
To sprawia, że praca z nim jest trudna. A jeśli nie znasz swoich kluczy w czasie kompilacji, będziesz potrzebować słownika lub interfejsu XPath, ponieważ nie będziesz w stanie przekonwertować go na klasę. To może teraz nie wydawać się wielkim problemem, ale im dłużej masz format danych, tym trudniej będzie to zmienić.
źródło
[{"key1": "value1", "key2": "value2"}]
. Drugim formatem jest umieszczenie prawdziwego klucza po prawej stronie i użycie innego klucza o nazwie „Nazwa”, aby wskazać prawdziwy klucz, co sprawia, że niezwykle trudno jest go sparsować za pomocą standardowych narzędzi.Trzeci format jest ogólnie najlepszy. Oto jednak przykład czegoś odpowiedniego dla 1. formatu:
Tutaj każdy obiekt odnosi się do osobnej rzeczy (a każdy obiekt używa tych samych kluczy, co inne, więc nie można ich scalić). Jednak każdy obiekt na liście jest przechowywany
{ "username": "foo", "id": 1 }
raczej niż[{ "username": "foo" }, { "id": 1 }]
dlatego, że 1) jest krótszy i 2) odnosi się do jednej rzeczy z nazwą użytkownika i identyfikatorem, a nie jednej rzeczy z nazwą użytkownika i innej rzeczy z identyfikatorem.Problem z drugą opcją polega na tym, że staje się bardzo gadatliwy zarówno jako JSON, jak i do pracy. Można go jednak użyć, jeśli chcesz przechowywać meta-informacje o nieruchomości. Przykład:
Tutaj
mutable
odnosi się do hipotetycznego przypadku, czy można zmodyfikować sama nieruchomość, a nie obiektu nadrzędnego. Takie meta-informacje są podobne do skryptów JavaScriptObject.defineProperty
, które przechowują informacje o właściwościach „konfigurowalne”, „wyliczalne” i „zapisywalne”.źródło
Mówisz, że są to pary klucz / wartość. W takim przypadku użyj nr 3: słownik par klucz / wartość.
Jeśli nie są to pary klucz / wartość, nie nazywaj ich „kluczami” i „wartościami” i użyj # 2, tablicy słowników z dowolną zawartością.
Struktura nr 1 jest po prostu głupia, chyba że potrzebujesz par klucz / wartość, ale także ich kolejności. Co rzadko robisz.
źródło
Postaw się w sytuacji osoby otrzymującej dżson. Jeśli nie znam nazwy klucza, jak mam ją odzyskać w pierwszym lub ostatnim formacie? Oczywiście możesz przełączyć przez JSON, ale ponieważ wszystkie trzy formaty osiągają ten sam wynik, to tylko kwestia składni. Myślę, że to jedyne znaczące pytanie: jeśli znasz nazwy kluczy, pierwsza lub ostatnia opcja jest bardziej zwarta, jeśli nie, drugi wybór jest bardziej zrozumiały.
źródło