web-dev-qa-db-ja.com

オブジェクトと配列の複雑なJSONネスト

私は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 }
                 ] 
} 

次の情報を格納するオブジェクトと配列のネスト構造を作成したい:

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

しかし、私はこれを行うための正しい方法がどうあるべきか見当がつかない。 JavaScriptオブジェクトを作成するだけですか? JSONはこのプロジェクトにとって意味がありますか?

このようなものを設定するための正しい構文は何ですか?

ここに私のコードがあります:

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

最初のコードはJavascriptコードの例です。これは似ていますが、JSONではありません。 JSONには1)コメントと2)varキーワードはありません

JSONにコメントはありませんが、varを削除して、次のように開始する必要があります。

orders: {

[{}]表記は「配列内のオブジェクト」を意味し、どこでも必要なものではありません。エラーではありませんが、目的によっては複雑すぎます。 AssociatedDrugはオブジェクトとして機能するはずです:

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

また、空のオブジェクトラボには何かを入力する必要があります。

それ以外は、コードは大丈夫です。 javascriptに貼り付けるか、JSON.parse()メソッド、またはその他の解析メソッドを使用できます( evalは使用しないでください

アップデート2の回答:

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

'aspirin'を返します。ただし、どこでもforeachに適しています

22
Corkscreewe

問題を解決しました。ここに私のコードがあります:

複雑なJSONオブジェクト:

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

データを取得してWebページに表示するjQueryコード:

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

});

});

15
Alex

JSON の言語定義に従っていることを確認してください。 2番目の例では、セクション:

"labs":[{
    ""
}]

オブジェクトは0個以上のキーと値のペア"a" : "b"で構成する必要があるため無効です。ここで、"b"は有効なvalue。一部のパーサーは{ "" }{ "" : null }として自動的に解釈する場合がありますが、これは明確に定義されたケースではありません。

また、ネストされたオブジェクトの配列[{}]をかなり使用しています。次の場合にのみこれを行います:

  1. 配列内の各オブジェクトに適切な「識別子」文字列はありません。
  2. そのエントリのKey-Valueに配列を使用する理由はいくつかあります。
4
devoid

最初に、データ構造(xml、json、yaml)の選択には通常、読みやすさ/サイズの問題のみが含まれます。例えば

Jsonは非常にコンパクトですが、人間は簡単に読むことができず、非常に難しいデバッグを行います。

Xmlは非常に大きいですが、誰でも簡単に読み取り/デバッグできます。

YamlはXmlとjsonの間にあります。

ただし、Javascriptを多用したり、ソフトウェアがブラウザとサーバー間で大量のデータ転送を行う場合は、Jsonを使用する必要があります。これは、純粋なjavascriptで非常にコンパクトだからです。ただし、文字列で記述しようとしないでください。ライブラリを使用して、オブジェクトから必要なコードを生成してください。

お役に立てれば。

1
gkaykck

この関数を使用して、キングの配列のネストされたネストされた配列内のオブジェクトを見つけることができます。

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