Комплексное 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>')
});
});
});
Ответы
Ответ 1
Первый код - пример кода 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
возвращает "аспирин". Тем не менее он лучше подходит для предвыборных мероприятий во всем мире
Ответ 2
Я успешно решил свою проблему. Вот мой код:
Комплексный объект 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"
}
]
}
Код 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");
});
});
Ответ 3
Убедитесь, что вы следуете определению языка для JSON. В вашем втором примере раздел:
"labs":[{
""
}]
Недопустимо, поскольку объект должен состоять из нуля или нескольких пар ключ-значение "a": "b"
, где "b"
может быть любым допустимым значением. Некоторые парсеры могут автоматически интерпретировать { "" }
как { "": null }
, но это не четко определенный случай.
Кроме того, вы довольно много используете вложенный массив объектов [{}]
. Я бы сделал это, только если:
- Для каждого объекта в массиве нет хорошей строки "идентификатор".
- Существует некоторая ясная причина наличия массива над значением ключа для этой записи.
Ответ 4
Во-первых, выбор структуры данных (xml, json, yaml) обычно включает только проблему чтения/размера. Например
Json очень компактен, но ни один человек не может легко его прочитать, очень тяжело отлаживать,
Xml очень большой, но каждый может легко прочитать/отладить его,
Ямль находится между Xml и json.
Но если вы хотите сильно работать с Javascript и/или ваше программное обеспечение делает большую передачу данных между браузером-сервером, вы должны использовать Json, потому что это чистый javascript и очень компактный. Но не пытайтесь писать его в строке, используйте библиотеки для генерации кода, который вам нужен от объекта.
Надеюсь это поможет.
Ответ 5
Вы можете попробовать использовать эту функцию для поиска любого объекта во вложенном вложенном массиве массивов королей.
пример
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