2013-07-28 18 views
12

Ho la seguente struttura JSON ma mi chiedo se ci sarebbe un modo per semplificare ulteriormente. È possibile rimuovere "ingrediente" e "quantità" da tutte le voci in qualche modo per ridurlo?Semplificare la struttura JSON

var cooking = { 
      "recipes" : [ 
       { 
        "name":"pizza", 
        "ingredients" : [ 
         { 
          "ingredient" : "cheese", 
          "quantity" : "100g" 
         }, 
         { 
          "ingredient" : "tomato", 
          "quantity" : "200g" 
         } 
        ] 
       }, 
       { 
        "name":"pizza 2", 
        "ingredients" : [ 
         { 
          "ingredient" : "ham", 
          "quantity" : "300g" 
         }, 
         { 
          "ingredient" : "pineapple", 
          "quantity" : "300g" 
         } 
        ] 
       } 
      ] 
     }; 
+3

Non si dovrebbe essere preoccupati per ridurlo a meno che i dati non si stanno trasferendo abbastanza veloce, in questo momento si dovrebbe essere più preoccupato che la struttura dei dati viene visualizzata la corretta intento – aaronman

risposta

14

Sì, è possibile semplificare che un bel po ':

var recipes = { 
    "pizza": { 
     "cheese": "100g", 
     "tomato": "200g" 
    }, 
    "pizza 2": { 
     "ham": "300g", 
     "pineapple": "300g" 
    } 
} 

Una spiegazione:

  • Il livello superiore del vostro esempio è un oggetto singolo elemento: {"recipes": <...>}. A meno che non si tratti di una versione semplificata di un oggetto che contiene effettivamente altri elementi, è ridondante. Il tuo codice sa cosa sta inviando/ricevendo, quindi non ci sono informazioni extra lì.

  • Il valore dell'oggetto {"recipes": <...>} è un array di oggetti a due elementi, con i tasti "name" e "ingredients". Ogni volta che si dispone di un array come questo, ha più senso (ed è più compatto) per sostituirlo con un oggetto. Come regola empirica:

    Se le chiavi in ​​un array di oggetti possono essere sostituiti da "key" e "value" e ancora un senso, sostituire la matrice con un solo oggetto.

  • Lo stesso vale per la vostra [{"ingredient": <...>, "quantity": <...>}, ...] matrice: ogni oggetto può essere sostituita da una coppia di valori-chiave e continuano ad avere un senso.

Il risultato finale è che questa rappresentazione delle informazioni è di 87 caratteri di lunghezza (con uno spazio estraneo rimosso), rispetto ai 249 caratteri del vostro originale - una riduzione del 65%.

+0

Un po 'confuso circa la downvote ... se c'è un problema con questa rappresentazione, non la vedo. –

+0

Non ho votato contro, ma direi che è perché ti sei sbarazzato della parte "ricette" – aaronman

+0

@aaronman Hmm, forse. Nell'esempio di OP, tuttavia, è completamente ridondante. –

3

Definitivamente. Un modo potrebbe essere:

var cooking = { 
     "recipes" : [ 
      { 
       "name":"pizza", 
       "ingredients" : [ 
        "cheese", 
        "tomato" 
        ], 
        "quantities" : [ // Have to be in order of ingredients 
         "100g", 
         "200g" 
       ] 
      } 
     ] 
    } 

O

var cooking = { 
    "recipes" : [ 
     { 
      "name":"pizza", 
      "ingredients" : [ // Putting ingredient and quantity together 
       "cheese:100g", 
       "tomato:200g" 
       ] 
     } 
    ] 
} 

Dal momento che sono tutte le pizze è possibile rimuovere il nome.

var cooking = { 
    "recipes" : [ 
     { 
      "ingredients" : [ 
       "cheese:100g", 
       "tomato:200g" 
       ] 
     }, 
     { 
      "ingredients" : [ 
       "ham:100g", 
       "pineapple:200g" 
       ] 
     } 
    ] 
} 
+4

Non sono sicuro che fare affidamento sull'ordinamento negli array sia il modo migliore per associare ingredienti e quantità. – brianestey

+0

@brianestey Potrebbe non essere la soluzione migliore, ma OP voleva una soluzione diversa, meno dettagliata.La prima soluzione utilizza "formaggio", "pomodoro" ecc. Come nomi che sarebbero davvero sul lato del valore. – fastcodejava

+0

Cerca di spiegare perché "formaggio" e "pomodoro" non dovrebbero essere le chiavi in ​​questo caso? Ovviamente non si verificheranno due volte nella stessa ricetta e ovviamente saranno sempre stringhe. –

0

Spero che questo lo semplifichi per te! Json deve essere scritto in un modo che sia minimo e comprensibile sia per i computer che per gli umani.

var cooking = { 
      "recipes" : 
      [   
      { 
       "name":"pizza", 
       "cheese": "100g" 
       "tomato": "200g" 
      }   
      , 
      { 
       "name":"pizza 2", 
       "ham": "300g" 
       "pineapple": "300g" 
      } 
      ] 
      } 
    };