使用OpenRefine(或R)解析大而复杂的Json文件的最佳方法

时间:2016-11-21 08:21:12

标签: json r openrefine

我知道如何在Open refine中解析json单元格,但这对我来说太棘手了。

enter image description here

我使用API​​来提取4730 AirBNB房间的日历,这些房间由他们的ID标识。

以下是一个Json文件的示例:https://fr.airbnb.com/api/v2/calendar_months?key=d306zoyjsyarp7ifhu67rjxn52tv0t20&currency=EUR&locale=fr&listing_id=4212133&month=11&year=2016&count=12&_format=with_conditions

对于每个ID以及从现在起到2017年11月的一年中的每一天,我想提取这个房间的可用性(真或假)及其当天的价格。

enter image description here

我无法弄清楚如何解析这些信息。我想这意味着一系列嵌套的forEach,但我无法通过Open Refine找到正确的方法。

我当然试过了

forEach(value.parseJson().calendar_months, e, e.days) 

结果是一系列字典数组扰乱了我。

任何帮助都会受到赞赏。如果在Open Refine中操作太难,那么使用R(或Python)的解决方案对我来说也没问题。

2 个答案:

答案 0 :(得分:2)

而不是仅仅将项目创建为文本,并使用GREL解析...

最好的方法是使用我们的可视导入器向导为JSON文件和XML文件选择要使用的JSON记录部件(您甚至可以使用指向JSON文件的URL,如示例所示)。 (视频教程显示了这里:https://www.youtube.com/watch?v=vUxdB-nl0Bw

  1. 选择包含您要解析和使用的记录的JSON部分(这可以是任何重复部分,只需选择其中一个,OpenRefine将提取所有其余部分) enter image description here

  2. 限制在创建期间要加载的数据行数,或保留所有行的默认值。 enter image description here

  3. 单击“创建项目”,然后单击“行”模式。但是,如果您认为记录模式可能更适合上下文,则只需再次将项目作为JSON导入,然后选择内容的下一个外部区域,可能是包含键字段的较大数组等。在示例中,键字段可能是日期,为什么我突出显示给定日期的整个记录​​。这样,OpenRefine将为每条记录提供密钥,而记录模式可让您比行模式更好地使用它们。

  4. 随意采取这个例子,让它变得更好,对所有人更有帮助,将它添加到How to Use上的Wiki部分

答案 1 :(得分:1)

我认为你走在正确的轨道上。输出:

forEach(value.parseJson().calendar_months, e, e.days) 

很难阅读,因为OpenRefine和JSON都使用方括号来表示数组。你从这个表达式得到的是一个包含12个项目的OR数组(一年中每个月一个)。 OR数组中的项目是JSON - 每个项目都是一个月中的天数。

为了保持步骤易于管理,我建议像这样处理:

首次使用

forEach(value.parseJson().calendar_months,m,m.days).join("|")

你必须使用'join',因为OR不能直接在单元格中存储OR数组 - 它必须是一个字符串。

然后使用“编辑单元格 - >分割多值单元格” - 这将为每个ID提供12行,每个包含一个JSON表达式。现在,对于每个ID,您在OR中有12行

然后使用:

forEach(value.parseJson(),d,d).join("|")

这会将JSON拆分为单独的日期

然后再次使用“编辑单元格 - >拆分多值单元格”将每天的详细信息拆分到自己的单元格中。

使用上面示例网址中的JSON - 这为单个ID提供了441行 - 每行包含描述可用性的JSON和&单日价格。此时,您可以使用ID列上的“填充”功能填写每行的ID。

现在,您已经在每个单元格中获得了一些非常简单的JSON - 因此您可以使用

提取可用性
value.parseJson().available