【问题标题】:mapping JSON to an Object将 JSON 映射到对象
【发布时间】:2012-04-23 21:25:15
【问题描述】:

我有一个从 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 好电话,我会并且可能稍后会问这个问题:)

【问题讨论】:

  • 路由器的组织是否保证相同的路由器类型彼此相邻?您能否举例说明生成的数据结构应该是什么样子?
  • 您的(解析的 json)数组中已经有很多路由器对象。你想把它们变成什么?
  • 您是否会在每次页面加载或刷新时解析/制作对象?创建所有这些并缓存这些可能会更好,因此您不必在路由器更改时解析数据 x 次。
  • 问题底部的回复
  • 我更新了我的答案以显示相同的想法,但没有 php--抱歉 =)

标签: javascript json object mapping


【解决方案1】:

您真的可以即时创建对象。对一组路由器对象进行硬编码不会更快,而且很可能会因手写而出错。

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

【讨论】:

  • 正是我想做的。我只是不确定如何使用我不想要的 JSON 结构动态构建我的对象。
  • @rd42 您想通过路由器名称快速查找吗?例如,您将查找特定的时间戳,如 routers["DWG-350"].usage[1].timestamp
  • 精确。我想从每个路由器生成的电子表格中查看历史数据。
  • 我相信就是这样。谢谢!
【解决方案2】:

我会先把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中的?
  • 没关系,还是有帮助的。
【解决方案3】:

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']);
 }

【讨论】:

  • @quodliberator 我也不清楚如何问它:) 我想总结一下。我想从我正在阅读的 JSON 结构中重构我的对象。你的答案看起来很有希望。
  • 您希望他们拥有什么样的结构?换句话说:你关心路由器的哪些属性?
猜你喜欢
  • 2019-05-27
  • 2014-11-07
  • 2017-12-24
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 2012-07-12
相关资源
最近更新 更多