将JSON映射到Object

时间:2012-04-11 14:40:24

标签: javascript json object mapping

我有一个从csv转换而来的JSON文件太大而无法手动编辑。它的'语法是我认为的一个大阵列。数据来自一组路由器,我的目标是构建路由器对象。当前CSV到JSON文件的方式由每一行组织,我想挑选每个路由器并有一个带路由器名称的对象,与该路由器关联的所有带宽测量。

你会怎么做?我在迭代JSON文件时尝试处理所有这些,当路由器发生变化时,我启动路由器对象的新实例。我不再是一个新手,只是一个慢学习者。那么下一步是使用js创建路由器类并使用我从我的巨型JSON数组中提取的内容填充该类,还是可以/我应该如何处理手写类并动态创建所有对象? (我可以动态创建对象。

当前的JSON(它继续用于页面,每个路由器在csv中有几百个条目:

[
   {
        "Router": "RouterID1",
        "TimeStamp": "2012/01/01 06:00:00",
        "transferBytes": "23235",
        "ReceivedBytes":  "29903"
   },
   {
        "Router": "RouterID1",
        "TimeStamp": "2012/01/01 06:05:00",
        "transferBytes": "21235",
        "ReceivedBytes":  "22103"
   }
   {
        "Router": "RouterID2",
        "TimeStamp": "2012/01/01 06:00:00",
        "transferBytes": "23235",
        "ReceivedBytes":  "29903"
   },
   {
        "Router": "RouterID2",
        "TimeStamp": "2012/01/01 06:05:00",
        "transferBytes": "21235",
        "ReceivedBytes":  "22103"
   }
]

@amnotiam:路由器类型被保证彼此不相干

这可能无效,但这是我认为我想要的结构:

[
   {
        "Router": "RouterID1"
        "TimeStamp": array of timestamps
        "transferBytes": array of bytes transferred for each timestamp
        "ReceivedBytes":  array of bytes received for each timestamp
   },
   {
        "Router": "RouterID2",
         "TimeStamp": array of timestamps
        "transferBytes": array of bytes transferred for each timestamp
        "ReceivedBytes":  array of bytes received for each timestamp
   }
]

@Bergi我想为每个路由器创建一个对象,其中包含对象中包含的历史数据。知道我每次进入都有一个对象。 (我认为)

@Rick好的电话,我将会以后可能会问这个问题:)

3 个答案:

答案 0 :(得分:1)

您可以实时创建对象。对一组路由器对象进行硬编码并不会更快,而且你可能会通过手写错误。

看看这个:http://jsfiddle.net/aSbm6/

答案 1 :(得分:1)

我首先将json转换为php变量,以便您可以更轻松地对其进行操作。看起来你的Json是一个很大的对象数组,所以它看起来像这样:

$routerArray = json_decode($yourJsonString);

然后你可以迭代并获取你的数据:

$newRouterObjectsArray = array();

foreach($routerArray as $routerObject) {
    if (empty($newRouterObjectsArray[$Router])) {
        // instantiate new router here:
        $newRouterObjectsArray[$Router] = new Router([params]);
    }
    // any other logic, assuming that the router does exist
}

如果您是直接在javascript中执行此操作,则看起来像:

var routerArray = JSON.parse([yourJsonString]);
var newRouterObjects = {};

for (routerEntry in routerArray) {
    if ('undefined' == typeof newRouterObjects[routerEntry->Router]) {
        //if this router doesn't exist yet, create it
        newRouterObjects[routerEntry->Router] = new Router([params]);
    }
    // update totals, etc.
}

答案 2 :(得分:1)

JSON.parse - 或者你的库的等价物 - 如果给你的JSON文件,将返回一个对象数组,因此你不需要创建对象。

如果我们在您的示例中调用data JSON字符串,那么:

var routers = JSON.parse(data);
routers[0].Router === "DWG-350"; // true
routers[1].TimeStamp === "2012/01/01 06:05:00"; // true

routers[0].Router === routers[1].Router; // true
routers[0].TimeStamp === routers[1].TimeStamp; // false

如果您需要进行逻辑或过滤,那么您可以将routers中的所有对象用作Javascript对象,因为它们是。

目前还不清楚你到底想要做什么。

我认为这是你想要的逻辑:

var routers = JSON.parse(data), // or jQuery.parseJSON()
    aggregate = {};


for (var i = 0, max = routers.length;
     i < max;
     i++) {

     var router = routers[i];
     if (typeof aggregate[routers[i].Router] === 'undefined') {
         aggregate[router['Router']] = {"TimeStamp": [],
                                         "ReceivedBytes": []}
                                         "TransferredBytes": []};

     }

     aggregate[router['Router']]["TimeStamp"]
         .push(router['TimeStamp']);
     aggregate[router['Router']]["ReceivedBytes"]
         .push(router['ReceivedBytes']);
     aggregate[router['Router']]["TransferredBytes"]
         .push(router['TransferredBytes']);
 }