自动将json处理为具有不同结构的对象

问题描述:

我有一个巨大的JSON文件.它的结构不正确,我无法控制该结构.它是基于时间戳来自一组路由器的数据.我正在尝试创建一个对象结构,该结构将给定路由器的所有信息组合成带有时间戳记等的路由器对象作为数组. @quodlibetor是使我接近这一点的巨大帮助.我还想从json中的名称val对的名称自动命名对象的属性.

I have a huge JSON file. It's not in the correct structure and I have no control over the structure. It is data coming from a group of routers based on timestamp. I'm trying to create an object structure that combines all the info for a given router into a router object with timestamp etc. as arrays. @quodlibetor was a big help getting me close to this. I also want to automatically name the properties of the object from the name of the name val pairs in the json.

我的目的是根据json文件中的名称自动命名属性,并将其重组为一个看起来像这样的对象(我对结构的建议持开放态度,这似乎是最有组织性的方法).

My aim is to autoname the properties from the names in the json file and to restructure it into an object that looks like this (I'm open to suggestions on the structure this just seemed the most organized way to do it).

这是我想要的结构:

    {
        "Router": [
            {
                "routerName": "RouterID1",
                "TimeStamp": [
                    "2012/01/01 06:00:00",
                    "2013/01/01 06:00:00",
                    "2014/01/01 06:00:00"
                ],
                "OutputBITS": [
                    "23235",
                    "29903",
                    "22103"
                ],
                "InputBITS": [
                    "23235",
                    "29903",
                    "22103"
                ]
            }
        ]
    }

尽管试图创建该结构,但我正在接近,但没有达成协议:

Although trying to create that structure I'm getting close but no deal:

{
    "RouterID1": {
        "timeStamp": [
            {
                "timeStamp": "2012/01/01 06:00:00"
            },
            {
                "timeStamp": "2013/01/01 06:00:00"
            },
            {
                "timeStamp": "2014/01/01 06:00:00"
            }
        ],
        "OutputBITS": [
            {
                "OutputBITS": "23235"
            },
            {
                "OutputBITS": "23235"
            },
            {
                "OutputBITS": "23235"
            }
        ],
        "InputBITS": [
            {
                "InputBITS": "29903"
            },
            {
                "InputBITS": "29903"
            },
            {
                "InputBITS": "29903"
            }
        ]
    }
}

原始JSON:

json = [
         {
              "Router": "RouterID1",
              "TimeStamp": "2012/01/01 06:00:00",
              "OutputBITS": "23235",
              "InputBITS":  "29903"
         },   
          {
              "Router": "RouterID1",
              "TimeStamp": "2013/01/01 06:00:00",
              "OutputBITS": "23235",
              "InputBITS":  "29903"
         },   
          {
              "Router": "RouterID1",
              "TimeStamp": "2014/01/01 06:00:00",
              "OutputBITS": "23235",
              "InputBITS":  "29903"
         },
         {
              "Router": "RouterID3",
              "TimeStamp": "2012/01/01 06:05:00",
              "OutputBITS": "21235",
              "InputBITS":  "22103"
         },
         {
             "Router": "RouterID3",
             "TimeStamp": "2012/01/01 06:05:00",
             "OutputBITS": "21235",
             "InputBITS":  "22103"
        },
        {
            "Router": "RouterID4",
            "TimeStamp": "2012/01/01 06:05:00",
            "OutputBITS": "21235",
            "InputBITS":  "22103"
       },
       {
           "Router": "RouterID4",
           "TimeStamp": "2012/01/01 06:05:00",
           "OutputBITS": "21235",
           "InputBITS":  "22103"
      }
      ];  

代码:

    //  Create routers object    
    var routers = {};


       for (var i=0;i<json.length;i++){
        var router_name = json[i].Router;
        router_name = (router_name.replace(/-/g, ""));  //take hyphen out or router name

        if (!routers[router_name]){
            // add properties to the router object thanks to @@quodlibetor

            // instead of using timeStamp is something like json[i] or json.[name] or some
            // way to reference each json property and not have to type it in?

            routers[router_name] = { timeStamp : [], OutputBITS : [], InputBITS : [] };
        }

                routers[router_name].timeStamp.push({
                    timeStamp : json[i].TimeStamp
                }); 
                 routers[router_name].OutputBITS.push({
                     OutputBITS : json[i].OutputBITS
                }); 
                routers[router_name].InputBITS.push({
                    InputBITS : json[i].InputBITS
                });  
    }; 

    console.log(routers);
    });
     </script>

这是您需要的代码:

var router = {router: []}, i, j, k, l, inArray, routerName, thisRouter;

for(i=0,j=json.length;i<j;++i) {
    inArray = false;

    routerName = json[i].Router;

    for(k=0,l=router.router.length;k<l;++k) {
        if(router.router[k].name === routerName) {
            inArray = true; --k; l = k;
        }
    }

    if(inArray === true) {
        router.router[k].TimeStamp.push(json[i].TimeStamp);
        router.router[k].OutputBITS.push(json[i].OutputBITS);
        router.router[k].InputBITS.push(json[i].InputBITS);
    } else {
        thisRouter = {name: routerName, TimeStamp: [json[i].TimeStamp], OutputBITS: [json[i].OutputBITS], InputBITS: [json[i].InputBITS]};

        router.router.push(thisRouter);
    }
}

console.log(router);