web-dev-qa-db-fra.com

Imbrication JSON complexe d'objets et de tableaux

J'ai des difficultés avec la syntaxe et la structure des objets/tableaux JSON.

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

Je veux créer une structure imbriquée d'objets et de tableaux contenant les informations suivantes:

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

Mais je n'ai aucune idée de ce que la bonne façon de faire devrait être. Devrais-je simplement créer des objets JavaScript? JSON a-t-il un sens pour ce projet?

Quelle est la syntaxe correcte pour définir quelque chose comme ceci?

Voici mon code jusqu'à présent:

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

Le premier code est un exemple de code Javascript, qui est similaire, mais pas JSON. JSON n'aurait pas 1) commentaires et 2) le mot clé var

Vous n'avez pas de commentaires dans votre JSON, mais vous devriez supprimer la var et commencer comme ceci:

orders: {

La notation [{}] signifie "objet dans un tableau" et n'est pas ce dont vous avez besoin partout. Ce n'est pas une erreur, mais c'est trop compliqué pour certaines raisons. AssociatedDrug devrait bien fonctionner comme un objet:

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

En outre, les laboratoires d'objets vides doivent être remplis.

En dehors de cela, votre code est correct. Vous pouvez soit le coller en javascript, soit utiliser la méthode JSON.parse(), ou n’importe quelle autre méthode d’analyse (s'il vous plaît n’utilisez pas eval )

Mise à jour 2 répondu:

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

renvoie 'aspirine'. Cependant, il convient mieux aux ordinateurs partout

21
Corkscreewe

J'ai résolu mon problème avec succès. Voici mon code:

L'objet JSON complexe:

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

Le code jQuery pour récupérer les données et les afficher sur ma page 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");

});

});

14
Alex

Assurez-vous de suivre la définition de la langue pour JSON . Dans votre deuxième exemple, la section:

"labs":[{
    ""
}]

N'est pas valide, car un objet doit être composé de zéro ou de plusieurs paires clé-valeur "a" : "b", où "b" peut être n'importe quel valeur valide. Certains analyseurs peuvent interpréter automatiquement { "" } comme étant { "" : null }, mais ce n'est pas un cas clairement défini.

En outre, vous utilisez assez souvent un array imbriqué[{}]. Je ne ferais ceci que si:

  1. Il n'y a pas de bonne chaîne "identifiant" pour chaque objet du tableau.
  2. Il y a une raison évidente d'avoir un tableau sur une valeur-clé pour cette entrée.
4
devoid

Tout d'abord, le choix d'une structure de données (xml, json, yaml) ne comprend généralement qu'un problème de lisibilité/taille. Par exemple

Json est très compact, mais aucun être humain ne peut le lire facilement, très difficile à déboguer,

XML est très volumineux, mais tout le monde peut facilement le lire/le déboguer,

Yaml est entre Xml et JSON.

Mais si vous souhaitez travailler beaucoup avec Javascript et/ou si votre logiciel effectue beaucoup de transfert de données entre un navigateur et un serveur, vous devez utiliser Json, car c'est du javascript pur et très compact. Mais n'essayez pas de l'écrire dans une chaîne, utilisez des bibliothèques pour générer le code nécessaire à partir d'un objet.

J'espère que cela t'aides.

1
gkaykck

Vous pouvez essayer d’utiliser cette fonction pour trouver n’importe quel objet dans un tableau imbriqué imbriqué de tableaux de rois.

Exemple

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