Le chiavi JSON sconosciute sono un approccio valido all'invio dei dati?

3

Ci sono un sacco di domande SO che chiedono "come" ottenere le chiavi JSON sconosciute da un oggetto JSON, e l'ho fatto molte volte, ma dopo aver iniziato a usare lo schema JSON per iniziare a progettare la richiesta e le risposte API, sono iniziando a chiedersi se si dispone di chiavi dinamiche sconosciute o addirittura che il consumatore JSON deve essere abbastanza intelligente da sapere come usarlo.

Ad esempio, supponi di progettare una semplice API di grafica per un grafico a barre. Potresti dire al tuo cliente che stai per inviare loro i dati in questo formato:

"data": {
  "Sunday": 1,
  "Monday": 2, 
  "Tuesday": 3,
  "Wednesday": 4,
  "Thursday": 5,
  "Friday": 6,
  "Saturday": 7
}

Tecnicamente, questo è sufficiente per creare un grafico in cui le etichette sull'asse x sono le chiavi in questo oggetto JSON, e i numeri sono gli scalari grafici sull'asse y. È anche tecnicamente dinamico, poiché puoi creare un intero nuovo grafico con lo stesso modello:

"data": {
  "Jack": 1,
  "Jill": 2,
  "Alice" 3
}

Mentre JSON consente flessibilità, sto iniziando a mettere in discussione l'usabilità di questo. Sembra l'equivalente del trattamento dei nomi delle variabili in una classe Java come modo di inviare informazioni.

Un approccio alternativo potrebbe essere quello di definire uno schema datapoint o qualcosa del genere:

"data": [
  {
    "category": "Jack",
    "value": 1
  },
  {
    "category": "Jill",
    "value": 2
  },
  {
    "category": "Alice",
    "value": 3
  }
]

Inoltre, questo sembra più estendibile, poiché è possibile aggiungere ulteriori valori allo schema. Tuttavia, probabilmente c'è meno marshalling ed è probabilmente un po 'più semplice usare l'approccio con le chiavi sconosciute.

Mi sono semplicemente chiesto, ho usato chiavi sconosciute nel passato, ma improvvisamente non sembrano l'approccio migliore.

  1. Usi le chiavi sconosciute come caso d'uso previsto per JSON? O solo un effetto collaterale che viene sfruttato?
  2. Esistono buone pratiche che promuovono o scoraggiano l'utilizzo di chiavi sconosciute?
  3. Se esistono best practice per l'utilizzo di chiavi sconosciute, in quali condizioni vengono raccomandate?
posta rhamilton 24.08.2017 - 00:14
fonte

2 risposte

6

Are using unknown keys an intended use case for JSON? Or just a side affect that is being taken advantage of?

Nel caso dei tuoi primi due esempi, è quest'ultimo. I dati vengono inseriti in un oggetto JSON, che è una struttura non ordinata. Questa mancanza di ordine rende questi due bit di equivalente JSON, anche se quello a destra non espone le barre sul grafico come desiderato:

"data": {           "data": {
  "Jack": 1,          "Alice": 3,
  "Jill": 2,          "Jack": 1,
  "Alice" 3           "Jill": 2
}                   }

Potresti scrivere un parser JSON che conserverà l'ordine dei membri, ma qualsiasi altra cosa l'elaborazione prima di vederlo non è probabile che faccia lo stesso. (ECMA 404 non dice nulla sull'ordine o sull'unicità, ma molti parser rappresentano oggetti JSON come dizionari che forzano questo comportamento.)

If there are any best practices for using unknown keys, under what conditions are they recommended?

La procedura migliore è usarli come previsto, ovvero in situazioni in cui è necessario cercare un valore per nome:

{
    "ssh": 22,
    "smtp": 25,
    "dns": 53,
    "http": 80
}

Le implicazioni di una struttura che memorizza i valori per chiave sono che le chiavi sono univoche e l'ordine non ha importanza. Se non sai quali sono le chiavi in anticipo, puoi comunque rispondere a domande come "quali sono le chiavi?" iterando su di loro e, dopo aver risposto, usa ciò che hai imparato a recuperare i valori.

Il tuo terzo esempio è il modo corretto per strutturare i dati. L'array impone l'ordine sulle barre nel tuo grafico. Gli oggetti (non ordinati) all'interno hanno membri il cui ordine non ha importanza perché qualsiasi cosa li usi li cercherà per nome.

    
risposta data 24.08.2017 - 03:09
fonte
0

JSON può essere usato abbastanza bene per rappresentare tre strutture dati di base: matrici, dizionari e strutture in stile C. Le matrici sono rappresentate dagli array JSON, i dizionari e le strutture sono rappresentati da "oggetti" JSON (lo standard JSON chiama i dizionari "oggetti"). L'unica differenza è che quando si rappresentano le strutture, si hanno spesso molti dizionari con lo stesso set di chiavi.

Il tuo "approccio alternativo" rende le cose più difficili. La maggior parte delle lingue dispone di una libreria standard che effettua la ricerca in un array lento e la ricerca rapida in un dizionario. Quindi il tuo approccio alternativo trasforma un dizionario in un array, sprecando spazio e, soprattutto, sprecando la velocità, o costringe lo sviluppatore del client a estrarre manualmente il dizionario dall'array JSON (e in tal caso, la ridondanza causa problemi - cosa succede se il tuo array contiene un dizionario con chiavi diverse?)

L'argomento "è più estensibile" è sbagliato. Un dizionario è costituito da coppie chiave-valore. I valori possono essere dizionari (dizionari questa volta contenenti strutture).

    
risposta data 25.08.2017 - 00:51
fonte

Leggi altre domande sui tag