2012-05-10 16 views
26

Sto avendo difficoltà con la sintassi e la struttura di oggetti/matrici JSON.Complesso nidificazione JSON di oggetti e matrici

{ 
    "accounting" : [ 
        { "firstName" : "John", 
         "lastName" : "Doe", 
         "age"  : 23 }, 

        { "firstName" : "Mary", 
         "lastName" : "Smith", 
         "age"  : 32 } 
       ],        
    "sales"  : [ 
        { "firstName" : "Sally", 
         "lastName" : "Green", 
         "age"  : 27 }, 

        { "firstName" : "Jim", 
         "lastName" : "Galley", 
         "age"  : 41 } 
       ] 
} 

voglio fare una struttura annidata di oggetti e gli array che alloggiare le seguenti informazioni:

{ 
"problems": [{ 
    "Diabetes":[{ 
     "medications":[{ 
      "medicationsClasses":[{ 
       "className":[{ 
        "associatedDrug":[{ 
         "name":"asprin", 
         "dose":"", 
         "strength":"500 mg" 
        }], 
        "associatedDrug#2":[{ 
         "name":"somethingElse", 
         "dose":"", 
         "strength":"500 mg" 
        }] 
       }], 
       "className2":[{ 
        "associatedDrug":[{ 
         "name":"asprin", 
         "dose":"", 
         "strength":"500 mg" 
        }], 
        "associatedDrug#2":[{ 
         "name":"somethingElse", 
         "dose":"", 
         "strength":"500 mg" 
        }] 
       }] 
      }] 
     }], 
     "labs":[{ 
      "missing_field": "missing_value" 
     }] 
    }], 
    "Asthma":[{}] 
}]} 

Ma non ho idea di ciò che il modo giusto per fare questo dovrebbe essere. Dovrei semplicemente creare oggetti JavaScript? JSON ha senso per questo progetto?

Qual è la sintassi corretta per impostare qualcosa di simile?

Ecco il mio codice finora:

$(document).ready(function() { 
    $.getJSON('js/orders.json', function(json) { 
     $.each(json.problems, function(index, order) { 
     $('.loadMeds').append('<p>' + order.name + '</p>') 
     }); 
    }); 
}); 
+0

sto solo facendo un test locale chiamando il file JSON con getJSON() in jQuery. Questo è solo per test in un ambiente di produzione. Il server è solo Apache che esegue PHP. (non molto ben informato con le cose del server ...) – Alex

+1

Esempio aggiornato – Alex

+1

Non sono sicuro di dove vuoi arrivare con questa domanda. Dovresti strutturare i dati in modo da poterli elaborare facilmente e ciò dipende da cosa stai facendo con i dati ... hai qualche particolare * domanda * tecnica? Altrimenti non vedo come questa domanda sia rispondente. –

risposta

21

Il primo codice è un esempio di codice Javascript, che è simile, ma non JSON.JSON non avrebbe 1) commenti e 2) la parola chiave var

Non avete commenti nel vostro JSON, ma si dovrebbe rimuovere il var e iniziare in questo modo:

orders: { 

I [{}] mezzi notazione "oggetto in un array" e non è quello che ti serve ovunque. Non è un errore, ma è troppo complicato per alcuni scopi. AssociatedDrug dovrebbe funzionare bene come un oggetto:

"associatedDrug": { 
       "name":"asprin", 
       "dose":"", 
       "strength":"500 mg" 
      } 

Inoltre, i laboratori oggetto vuoto devono essere riempiti con qualcosa.

A parte questo, il tuo codice è a posto. È possibile incollarlo in javascript, o utilizzare il metodo JSON.parse(), o qualsiasi altro metodo di analisi (si prega di don't use eval)

Update 2 ha risposto:

obj.problems[0].Diabetes[0].medications[0].medicationsClasses[0].className[0].associatedDrug[0].name 

restituisce 'aspirina'. È comunque più adatto per le foreaches ovunque

+0

Grazie per il suggerimento su eval()! Mi assicurerò di evitarlo :) – Alex

+4

@Alex - Una volta scoperto che 'JSON.parse()' non funziona in IE7, c'è un metodo in jQuery per farlo in tutti i browser. '$ .parseJSON()' –

+0

è quello che ho finito per fare. Guarda la mia soluzione che ho postato. Ho usato le istruzioni $ .each annidate per prendere i dati che stavo cercando. Grazie per l'aiuto! – Alex

1

In primo luogo, la scelta di una struttura di dati (XML, JSON, YAML) comprende di solito solo un problema di leggibilità/dimensione. Per esempio

JSON è molto compatta, ma nessun essere umano può leggere facilmente, molto difficile fare il debug,

Xml è molto grande, ma tutti possono facilmente leggere/debug,

Yaml è in tra Xml e JSON.

Ma se si vuole lavorare con Javascript pesantemente e/o il software fa un sacco di trasferimento di dati tra il browser del server, è necessario utilizzare JSON, perché è puro JavaScript e molto compatto. Ma non cercare di scriverlo in una stringa, utilizzare le librerie per generare il codice necessario da un oggetto.

Spero che questo aiuti.

+0

Non so cosa significhi "utilizzare le librerie per generare il codice necessario da un oggetto". Potresti fare un esempio? – Alex

+1

@Alex Ad esempio, crea l'array/oggetto in php, quindi usa json_encode() per convertirlo in json valido. –

+1

crea un oggetto in php, quindi lo invii o lo incorpori nella tua pagina con il metodo json_encode(). Il processo si chiama serializzazione di un oggetto, mi dispiace, ho dimenticato di dirlo in questione; http://www.itnewb.com/tutorial/Introduction-to-JSON-and-PHP/page3 ecco un esempio – gkaykck

4

Assicurarsi di seguire la definizione della lingua per JSON. Nel suo secondo esempio, la sezione:

"labs":[{ 
    "" 
}] 

non è valido in quanto un oggetto deve essere composto da zero o più coppie chiave-valore "a" : "b", dove "b" può essere qualsiasi valore valido . Alcuni parser potrebbero interpretare automaticamente { "" } come { "" : null }, ma questo non è un caso chiaramente definito.

Inoltre, si sta utilizzando una serie di oggetti nidificati [{}]. Lo farei solo se:

  1. Non c'è una buona stringa "identificatore" per ogni oggetto nell'array.
  2. C'è una ragione chiara per avere una matrice su un valore-chiave per quella voce.
+0

Labs è un semplice segnaposto .... Questo è solo un concetto approssimativo. So che ha bisogno di un valore. – Alex

13

Ho risolto con successo il mio problema. Qui è il mio codice:

L'oggetto JSON complesso:

{ 
    "medications":[{ 
      "aceInhibitors":[{ 
       "name":"lisinopril", 
       "strength":"10 mg Tab", 
       "dose":"1 tab", 
       "route":"PO", 
       "sig":"daily", 
       "pillCount":"#90", 
       "refills":"Refill 3" 
      }], 
      "antianginal":[{ 
       "name":"nitroglycerin", 
       "strength":"0.4 mg Sublingual Tab", 
       "dose":"1 tab", 
       "route":"SL", 
       "sig":"q15min PRN", 
       "pillCount":"#30", 
       "refills":"Refill 1" 
      }], 
      "anticoagulants":[{ 
       "name":"warfarin sodium", 
       "strength":"3 mg Tab", 
       "dose":"1 tab", 
       "route":"PO", 
       "sig":"daily", 
       "pillCount":"#90", 
       "refills":"Refill 3" 
      }], 
      "betaBlocker":[{ 
       "name":"metoprolol tartrate", 
       "strength":"25 mg Tab", 
       "dose":"1 tab", 
       "route":"PO", 
       "sig":"daily", 
       "pillCount":"#90", 
       "refills":"Refill 3" 
      }], 
      "diuretic":[{ 
       "name":"furosemide", 
       "strength":"40 mg Tab", 
       "dose":"1 tab", 
       "route":"PO", 
       "sig":"daily", 
       "pillCount":"#90", 
       "refills":"Refill 3" 
      }], 
      "mineral":[{ 
       "name":"potassium chloride ER", 
       "strength":"10 mEq Tab", 
       "dose":"1 tab", 
       "route":"PO", 
       "sig":"daily", 
       "pillCount":"#90", 
       "refills":"Refill 3" 
      }] 
     } 
    ], 
    "labs":[{ 
     "name":"Arterial Blood Gas", 
     "time":"Today", 
     "location":"Main Hospital Lab"  
     }, 
     { 
     "name":"BMP", 
     "time":"Today", 
     "location":"Primary Care Clinic"  
     }, 
     { 
     "name":"BNP", 
     "time":"3 Weeks", 
     "location":"Primary Care Clinic"  
     }, 
     { 
     "name":"BUN", 
     "time":"1 Year", 
     "location":"Primary Care Clinic"  
     }, 
     { 
     "name":"Cardiac Enzymes", 
     "time":"Today", 
     "location":"Primary Care Clinic"  
     }, 
     { 
     "name":"CBC", 
     "time":"1 Year", 
     "location":"Primary Care Clinic"  
     }, 
     { 
     "name":"Creatinine", 
     "time":"1 Year", 
     "location":"Main Hospital Lab" 
     }, 
     { 
     "name":"Electrolyte Panel", 
     "time":"1 Year", 
     "location":"Primary Care Clinic"  
     }, 
     { 
     "name":"Glucose", 
     "time":"1 Year", 
     "location":"Main Hospital Lab" 
     }, 
     { 
     "name":"PT/INR", 
     "time":"3 Weeks", 
     "location":"Primary Care Clinic"  
     }, 
     { 
     "name":"PTT", 
     "time":"3 Weeks", 
     "location":"Coumadin Clinic"  
     }, 
     { 
     "name":"TSH", 
     "time":"1 Year", 
     "location":"Primary Care Clinic"  
     } 
    ], 
    "imaging":[{ 
     "name":"Chest X-Ray", 
     "time":"Today", 
     "location":"Main Hospital Radiology"  
     }, 
     { 
     "name":"Chest X-Ray", 
     "time":"Today", 
     "location":"Main Hospital Radiology"  
     }, 
     { 
     "name":"Chest X-Ray", 
     "time":"Today", 
     "location":"Main Hospital Radiology"  
     } 
    ] 
} 

Il codice jQuery per afferrare i dati e visualizzarli sulla mia pagina web:

$(document).ready(function() { 
var items = []; 

$.getJSON('labOrders.json', function(json) { 
    $.each(json.medications, function(index, orders) { 
    $.each(this, function() { 
     $.each(this, function() { 
      items.push('<div class="row">'+this.name+"\t"+this.strength+"\t"+this.dose+"\t"+this.route+"\t"+this.sig+"\t"+this.pillCount+"\t"+this.refills+'</div>'+"\n"); 
     }); 
    }); 
    }); 

    $('<div>', { 
    "class":'loaded', 
    html:items.join('') 
    }).appendTo("body"); 

}); 

});

+9

Un po 'tardi per me per commentare forse; ma mi sembra che tu stia ancora usando * matrici * molto *, anche quando sembra che ci possa essere solo un oggetto. Ad esempio, la proprietà 'medications' di primo livello è una matrice di un singolo oggetto. A meno che tu non abbia davvero bisogno di contabilizzare più * raccolte * di tipi di medicine qui, eliminerei del tutto gli array. Quindi puoi semplicemente usare 'var x = medications.aceInhibitors' invece di' medications [0] .aceInhibitors'. (A me il secondo dice "Sto prendendo la proprietà aceInhibitors del * primo * oggetto medicazioni" - cosa significa per prima cosa qui?) –

+0

Non penso che sia necessario mettere le proprietà dei tipi di med in un array. In realtà, esiste un metodo consigliato per costruire JSON per le prestazioni. Vedi le proprietà che ordinano https://google.github.io/styleguide/jsoncstyleguide.xml?showone=Property_Ordering_Example#Property_Ordering_Example –

0

Si può provare a usare questa funzione per trovare qualsiasi oggetto nella matrice annidata annidata di matrici di re.

Esempio

function findTByKeyValue (element, target){ 
     var found = true; 
     for(var key in target) { 
      if (!element.hasOwnProperty(key) || element[key] !== target[key]) { 
       found = false; 
       break; 
      } 
     } 
     if(found) { 
      return element; 
     } 
     if(typeof(element) !== "object") { 
      return false; 
     } 
     for(var index in element) { 
      var result = findTByKeyValue(element[index],target); 
      if(result) { 
       return result; 
      } 
     } 
    }; 

findTByKeyValue(problems,{"name":"somethingElse","strength":"500 mg"}) =====> result equal to object associatedDrug#2 
Problemi correlati