ОК, так что я, наконец, решил это сделать. Публикация здесь для будущих людей (включая меня;)):
Проблема заключалась в том, что Gradle был более строгим, чем Javac, при работе с обработчиками аннотаций, которые были необходимы для создания моего отсутствующего файла. В этом случае мне просто пришлось добавить обработчик аннотации Log4j в список зависимостей -> annotationProcessor.
Две полезные идеи: (1) объекты : если когда-нибудь это будет настоящая система, а данные из службы представляют группы людей, то код должен сказать это тоже. В качестве примера я включил простой объект Person
, который знает, как создать себя из плоского представления, и знает, как отобразить себя на консоли. (2) порядок ключей не определен в объекте JS. Чтобы получить значения из специально упорядоченных ключей, необходимо указать порядок. Метод person print()
делает это с помощью массива.
См. Здесь, на подмножестве данных ...
$.getJSON("http://localhost:8000/data.json", function(data) {
print_items(data);
});
class Person {
constructor(data) {
this.id = Object.keys(data)[0];
this.state = data[this.id][0];
}
print() {
console.log(this.id);
let displayKeys = ['name', 'registration_1', 'registration_2', 'week', 'half_term'];
displayKeys.forEach(key => console.log(this.state[key]));
}
asTableRow() {
let displayKeys = ['name', 'registration_1', 'registration_2', 'week', 'half_term'];
let tds = displayKeys.map(key => `<td>${this.state[key]}</td>`);
return `<tr>${tds}</tr>`;
}
}
function print_items(data) {
Object.keys(data).forEach(groupKey => {
let group = data[groupKey];
Object.keys(group).forEach(personKey => {
let person = new Person(group[personKey]);
person.print();
});
});
}
Вы можете очистить внутренний цикл, посмотрев на каждую клавишу и передав только значение. Также я предлагаю вытащить Object.keys(person).length
из цикла for, потому что он будет обрабатывать ключи каждого цикла. Если вы помещаете их в переменную и указываете, что это позволяет избежать переоценки ключей.
var groups = Object.keys(testData);
for(var i = 0; i<groups.length; i++){
var group = testData[groups[i]];
for(var j = 0; j<group.length; j++){
var personEntry = group[j];
var person_id = Object.keys(personEntry)[0];
console.log(person_id);
var personEntries = personEntry[person_id];
for(var k = 0; k<personEntries.length; k++){
var personValues = Object.values(personEntries[k]);
for(var l = 0; l<personValues.length; l++){
console.log(personValues[l]);
}
}
}
}
Просмотрите свойства объекта с помощью цикла for / in.
Я добавил цикл for / in в ваш код (используя объект person_info) и протестировал его, и он печатает то, что вы хотите. Надеюсь, это поможет.
function output_json(data) {
var i, j, k;
for (i=0; i<Object.keys(data).length; i++) {
group_=Object.values(data)[i];
for (j=0; j<Object.keys(group_).length; j++) {
person=Object.values(group_)[j];
person_id=Object.keys(person)[0];
console.log(person_id);
for (k=0; k<Object.keys(person).length; k++) {
person_info=Object.values(person)[k][0];
//loop through the properties of the person_info object
//using a for/in loop
for (var key in person_info) {
console.log(person_info[key]);
}
}
}
}
}