将JSON映射到对象
我有一个从csv转换而来的JSON文件太大而无法编辑。它的语法是我认为的一个大阵列。数据来自一组路由器,我的目标是构建路由器对象。当前CSV到JSON文件的方式由每行组织,我想挑选出每个路由器并使用路由器名称的对象,以及与该路由器相关的所有带宽度量。将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:路由器类型gauranteed是adjecent彼此
这可能是无效的,但这里是我想我会为结构:
[
{
"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良好的通话,我会和可能会问这个问题后:)
可以真的只是动态创建的对象。硬编码一组路由器对象不会更快,并且很可能你会通过手写来犯错误。
我会打开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.
}
我不认为这个项目是在PHP? – quodlibetor 2012-04-11 15:02:29
好点 - 我以为我有PHP标签,但我没有=/ – 2012-04-11 15:03:28
没关系,它仍然可以帮助。 – rd42 2012-04-11 15:09:19
JSON.parse
图书馆的等效--or - 如果给你的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']);
}
@quodliberator我不清楚如何去问它:)我想总结一下。我想从我正在阅读的JSON结构重新构建对象。您的答案看起来很有希望。 – rd42 2012-04-11 15:12:43
你想让他们拥有什么样的结构?换句话说:你关心哪些路由器属性? – quodlibetor 2012-04-11 15:16:08
进行组织,以便在同一路由器类型的保证是彼此相邻路由器?你能举出一个结果数据结构应该是什么样子的例子吗? – 2012-04-11 14:46:16
你的(解析的json)数组中的路由器已经有了很多对象。你想要改变他们什么? – Bergi 2012-04-11 14:46:19
每次页面加载或刷新时你都会解析/制作对象吗?创建所有这些和缓存这些可能会更好,因此您不必在路由器更改时解析数据x次数。 – Rick 2012-04-11 14:47:51