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

Best way to parse a big and intricated Json file with OpenRefine (or R)

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

我使用 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 月的每一天,我想提取这个房间的可用性(真或假)及其在这一天的价格。

我不知道如何解析这些信息。我想这意味着一系列嵌套的 forEach,但我找不到使用 Open Refine 执行此操作的正确方法。

我试过了,当然,

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

结果是一堆乱七八糟的字典。

如有任何帮助,我们将不胜感激。如果在Open Refine中操作太难,用R(或Python)的解决方案对我来说也可以。

我认为您的方向是正确的。的输出:

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

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

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

首次使用

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

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

然后使用 "Edit Cells->Split multi-valued cells" - 这将为每个 ID 提供 12 行,每行包含一个 JSON 表达式。现在对于每个 ID,您在 OR

中有 12 行

然后使用:

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

这将 JSON 分成单独的几天

然后再次使用 "Edit Cells->Split multi-valued cells" 将每一天的详细信息拆分到自己的单元格中。

使用上面示例 URL 中的 JSON - 这为我提供了 441 行的单个 ID - 每行都包含 JSON 描述一天的可用性和价格。此时您可以在 ID 列上使用 'fill down' 函数为每一行填写 ID。

您现在在每个单元格中都有一些非常简单的 JSON - 因此您可以使用

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

等等

而不只是将项目创建为文本,然后使用 GREL 解析...

最好的方法就是 select 您想要使用我们的 JSON 文件和 XML 文件的可视化导入向导来处理的 JSON 记录部分(您甚至可以像您的示例一样使用 URL 指向 JSON 文件)。 (这里有一个视频教程:https://www.youtube.com/watch?v=vUxdB-nl0Bw

  1. Select JSON 包含您要解析和使用的记录的部分(这可以是任何重复部分,只是 select 其中之一它们和 OpenRefine 将提取所有其余部分)

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

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

随时接受这个例子,让它变得更好,甚至对所有人更有帮助,将它添加到我们在 How to Use

上的 Wiki 部分