Как бы я перестроил этот объект JSON с помощью JavaScript или jQuery - PullRequest
0 голосов
/ 10 октября 2011
{
"oozie": {
    "admin": {},
    "hosts-list": [
        "1"
    ],
    "hostsinfo": [
        {
            "host-id": "1",
            "details": "Failed ProcessHealthMonitor health check 1 times consecutively",
            "currstatus": "Warning",
            "currstatusclass": "warning"
        },
        {
            "host-id": "2",
            "details": "Failed ProcessHealthMonitor health check 1 times consecutively",
            "currstatus": "Warning",
            "currstatusclass": "warning"
        },
        {
            "host-id": "4",
            "details": "Failed ProcessHealthMonitor health check 1 times consecutively",
            "currstatus": "Warning",
            "currstatusclass": "warning"
        },
        {
            "host-id": "5",
            "details": "Failed ProcessHealthMonitor health check 1 times consecutively",
            "currstatus": "Warning",
            "currstatusclass": "warning"
        }
    ],
    "status": [
        {}
    ]
},
"single-namenode": {
    "admin": {},
    "hosts-list": [
        "1"
    ],
    "hostsinfo": [
        {
            "host-id": "1",
            "details": "Running Service",
            "currstatus": "Running",
            "currstatusclass": "success"
        }
    ],
    "status": [
        {}
    ]
},
"single-database": {
    "admin": {},
    "hosts-list": [
        "1"
    ],
    "hostsinfo": [
        {
            "host-id": "1",
            "details": "Running Service",
            "currstatus": "Running",
            "currstatusclass": "success"
        }
    ],
    "status": [
        {}
    ]
},
"secondarynamenode": {
    "admin": {},
    "hosts-list": [
        "1"
    ],
    "hostsinfo": [
        {
            "host-id": "1",
            "details": "Running Service",
            "currstatus": "Running",
            "currstatusclass": "success"
        }
    ],
    "status": [
        {}
    ]
},
"datanode": {
    "admin": {},
    "hosts-list": [
        "1"
    ],
    "hostsinfo": [
        {
            "host-id": "1",
            "details": "Failed HttpHealthMonitor health check 2 times consecutively",
            "currstatus": "Warning",
            "currstatusclass": "warning"
        }
    ],
    "status": [
        {}
    ]
},
"web": {
    "admin": {},
    "hosts-list": [
        "1"
    ],
    "hostsinfo": [
        {
            "host-id": "1",
            "details": "Setting Master IP",
            "currstatus": "Dead",
            "currstatusclass": "error"
        }
    ],
    "status": [
        {}
    ]
},
"tasktracker": {
    "admin": {},
    "hosts-list": [
        "1"
    ],
    "hostsinfo": [
        {
            "host-id": "1",
            "details": "Running Service",
            "currstatus": "Running",
            "currstatusclass": "success"
        }
    ],
    "status": [
        {}
    ]
},
"jobtracker": {
    "admin": {},
    "hosts-list": [
        "1"
    ],
    "hostsinfo": [
        {
            "host-id": "1",
            "details": "Running Master Service",
            "currstatus": "Running",
            "currstatusclass": "success"
        }
    ],
    "status": [
        {}
    ]
}
}

Я занимался этим уже несколько дней, пытаясь выяснить это, и я просто не могу это прибить. У меня нет никакого контроля над фактическим объектом JSON и как выглядит его вывод. Однако у меня совершенно иная потребность в этом, так как в его нынешней структуре для меня ничего не стоит, кроме вопросов.

То, что я хочу делать предпочтительно с jQuery, это

получить названия главных объектов Oozie, Single-namenode, единственная база данных, вторичныйnamenode, и т. Д ... и восстановите объект для хранения, который следует более практичному формату для использования.

В конце я хотел бы увидеть новый объект, похожий на

{ 
  "myservices":{[
     {"name":"oozie", "host-id": "1", "details":"failed process health monitor....", "currstatus":"Warning", "currstatusclass":"warning"},
     {"name":"oozie", "host-id": "2", "details":"failed process health monitor....", "currstatus":"Warning", "currstatusclass":"warning"},
     {"name":"oozie", "host-id": "3", "details":"failed process health monitor....", "currstatus":"Warning", "currstatusclass":"warning"},
     {"name":"oozie", "host-id": "4", "details":"failed process health monitor....", "currstatus":"Warning", "currstatusclass":"warning"},
     {"name":"oozie", "host-id": "5", "details":"failed process health monitor....", "currstatus":"Warning", "currstatusclass":"warning"},
     {"name":"single-namenode", "host-id": "2", "details":"failed process health monitor....", "currstatus":"Warning", "currstatusclass":"warning"}

  ]}

Моя последняя неудачная попытка:

$('.refreshAllb').click(function() {
    var outputCon = '';
    $.getJSON('services.json', function(data) {
        $('#master_service_container').empty();
        $.each(data, function(i, object){
            $.each(object, function(property, value){
                if(property == "hostsinfo")
                {
                    $.each(value, function(propertyX, valueX){
                        outputCon += propertyX[valueX] +'<br>';
                    });
                }
            });
        });
        $('#master_service_container').html(outputCon);
    });
});

Как я сказал, я был в этом в течение нескольких дней, когда я в своем уме, любая помощь очень ценится.

Ответы [ 3 ]

3 голосов
/ 10 октября 2011

Вот пример.Обратите внимание, что ваш требуемый вывод является недействительным JSON.Свойство myservices не может быть объектом и массивом, как в вашем примере.Это должен быть либо объект (ассоциативный массив), либо стандартный массив javascript:

var input = ... the original object

var output = { myservices: [] };
for (var key in input) {
    if (input.hasOwnProperty(key)) {
        for (var i = 0, hostsinfo = input[key].hostsinfo; i < hostsinfo.length; i++) {
            output.myservices.push({
                'name': key,
                'host-id': hostsinfo[i]['host-id'],
                'details': hostsinfo[i]['details'],
                'currstatus': hostsinfo[i]['currstatus'],
                'currstatusclass': hostsinfo[i]['currstatusclass']
            });
        }
    }
}

// TODO: use the output

Live demo .

2 голосов
/ 10 октября 2011
var result = {};
var myservices = [];
$.each(data.oozie.hostsinfo,function(key,value){
    var temp = {}
    temp.name = "oozie";
    temp.host-id = value.host-id;
    temp.details = value.details;
    temp.currstatus = value.currstatus;
    temp.currstatusclass = value.currstatusclass;
    myservices.push(temp);
})
$.each(data.single-namenode.hostsinfo,function(key,value){
    var temp = {}
    temp.name = "single-namenode";
    temp.host-id = value.host-id;
    temp.details = value.details;
    temp.currstatus = value.currstatus;
    temp.currstatusclass = value.currstatusclass;
    myservices.push(temp);
})
result.myservices = myservices;
2 голосов
/ 10 октября 2011

Попробуйте:

function restructure(data) {
  var result = {myservices: []}, i, name;

  for (name in data) {
    if (data.hasOwnProperty(name) && data[name].hostsinfo !== undefined) {
      for (i = 0; i < data[name].hostsinfo.length; i += 1) {
        result.myservices.push($.extend({name: name}, data[name].hostsinfo[i]));
      }
    }
  }

  return result;
}

// with data being your input data
console.log(data, restructure(data));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...