私は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>')
});
});
});
最初のコードは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に適しています
問題を解決しました。ここに私のコードがあります:
複雑な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");
});
});
JSON の言語定義に従っていることを確認してください。 2番目の例では、セクション:
"labs":[{
""
}]
オブジェクトは0個以上のキーと値のペア"a" : "b"
で構成する必要があるため無効です。ここで、"b"
は有効なvalue。一部のパーサーは{ "" }
を{ "" : null }
として自動的に解釈する場合がありますが、これは明確に定義されたケースではありません。
また、ネストされたオブジェクトの配列[{}]
をかなり使用しています。次の場合にのみこれを行います:
最初に、データ構造(xml、json、yaml)の選択には通常、読みやすさ/サイズの問題のみが含まれます。例えば
Jsonは非常にコンパクトですが、人間は簡単に読むことができず、非常に難しいデバッグを行います。
Xmlは非常に大きいですが、誰でも簡単に読み取り/デバッグできます。
YamlはXmlとjsonの間にあります。
ただし、Javascriptを多用したり、ソフトウェアがブラウザとサーバー間で大量のデータ転送を行う場合は、Jsonを使用する必要があります。これは、純粋なjavascriptで非常にコンパクトだからです。ただし、文字列で記述しようとしないでください。ライブラリを使用して、オブジェクトから必要なコードを生成してください。
お役に立てれば。
この関数を使用して、キングの配列のネストされたネストされた配列内のオブジェクトを見つけることができます。
例
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