wake-up-neo.net

Komplexe JSON-Verschachtelung von Objekten und Arrays

Ich habe Schwierigkeiten mit der Syntax und Struktur von JSON-Objekten/Arrays.

{ 
  "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 }
                 ] 
} 

Ich möchte eine verschachtelte Struktur von Objekten und Arrays erstellen, die die folgenden Informationen enthalten würde:

{
"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":[{}]
}]}

Aber ich habe keine Ahnung, wie der richtige Weg dafür sein sollte. Soll ich nur JavaScript-Objekte erstellen? Ist JSON für dieses Projekt sinnvoll?

Was ist die richtige Syntax, um so etwas aufzustellen?

Hier ist mein Code bisher:

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

Der erste Code ist ein Beispiel für Javascript-Code, der ähnlich ist, jedoch nicht JSON. JSON hätte nicht 1) Kommentare und 2) das Schlüsselwort var

Sie haben keine Kommentare in Ihrem JSON, aber Sie sollten die var entfernen und wie folgt beginnen:

orders: {

Die [{}]-Notation bedeutet "Objekt in einem Array" und ist nicht das, was Sie überall brauchen. Es ist kein Fehler, aber für manche Zwecke zu kompliziert. AssociatedDrug sollte als Objekt gut funktionieren:

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

Die leeren Objektlabors sollten auch mit etwas gefüllt werden.

Ansonsten ist Ihr Code in Ordnung. Sie können es entweder in Javascript einfügen oder die JSON.parse()-Methode oder eine andere Parsing-Methode verwenden (bitte eval nicht verwenden )

Update 2 beantwortet:

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

gibt 'Aspirin' zurück. Es ist jedoch für foreaches überall besser geeignet

21
Corkscreewe

Ich habe mein Problem erfolgreich gelöst. Hier ist mein Code:

Das komplexe JSON-Objekt:

   {
    "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"    
        }
    ]
}

Der jQuery-Code, um die Daten zu übernehmen und auf meiner Webseite anzuzeigen:

$(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");

});

});

14
Alex

Stellen Sie sicher, dass Sie der Sprachdefinition für JSON folgen. In Ihrem zweiten Beispiel, dem Abschnitt:

"labs":[{
    ""
}]

Ist ungültig, da ein Objekt aus null oder mehr Schlüsselwertpaaren "a" : "b" bestehen muss, wobei "b" ein beliebiger gültiger value sein kann. Einige Parser interpretieren { "" } möglicherweise automatisch als { "" : null }. Dies ist jedoch kein klar definierter Fall.

Außerdem verwenden Sie ein verschachteltes -Array von Objekten[{}]. Ich würde das nur tun, wenn:

  1. Für jedes Objekt im Array gibt es keine geeignete Zeichenfolge "bezeichner".
  2. Es gibt einen eindeutigen Grund dafür, dass ein Array einen Schlüsselwert für diesen Eintrag hat.
4
devoid

Zunächst beinhaltet die Auswahl einer Datenstruktur (xml, json, yaml) normalerweise nur ein Problem mit der Lesbarkeit/Größe. Zum Beispiel

Json ist sehr kompakt, aber kein menschliches Wesen kann es leicht lesen.

XML ist sehr groß, aber jeder kann es leicht lesen/debuggen,

Yaml ist zwischen Xml und Json.

Wenn Sie jedoch stark mit Javascript arbeiten möchten und/oder Ihre Software viel Daten zwischen Browser-Servern überträgt, sollten Sie Json verwenden, da es sich um reines Javascript handelt und sehr kompakt ist. Versuchen Sie nicht, es in einen String zu schreiben, sondern verwenden Sie Bibliotheken, um den Code zu generieren, den Sie aus einem Objekt benötigen.

Hoffe das hilft.

1
gkaykck

Sie können mit dieser Funktion versuchen, ein beliebiges Objekt in verschachtelten geschachtelten Arrays von Kings-Arrays zu finden.

Beispiel

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
0
hmota