在GREL中解析多值JSON(OpenRefine)

我有一个包含以下内容的专栏:

7. {"resource":"abc"}
8. [{"resource":"def"},{"resource":"ghi"}]

我试着获取“资源”的内容:

value.parseJson().resource

作品.如果我试图获取多值单元格的内容,我无法让它工作.我按照https://github.com/OpenRefine/OpenRefine/wiki/GREL-Other-Functions试了一下:

forEach(value.parseJson().resource,v,v.resource)

我收到很多错误,例如:

7.  {"resource":"abc"}  Error: First argument to forEach is not an array
8.  [{"resource":"def"},{"resource":"ghi"}] Error: Object does not have any field, including resource

我只能获得多值单元格,但不能获得具有此单元格的单值单元格:

forEach(value.parseJson(),v,v.resource)

最佳答案 您遇到的问题是包含JSON数组(即多个值)的单元格与不包含JSON数组的单元格之间的差异.

有不同的方法来解决这个问题,最好的方法可能取决于整体数据的一致性.

我的第一个建议是使用过滤器或构面分别处理单个值和数组单元格.鉴于您在示例中使用的数据,我认为以下内容可行:

1)使用GREL在列上创建自定义文本构面

value.startsWith("[")

2)从构面中选择“false”以使用单值单元格
3)对于这些细胞,使用GREL

value.parseJson().resource

4)从构面中选择“true”以使用阵列单元格
5)对于这些细胞,使用GREL

forEach(value.parseJson(),v,v.resource)

(n.b.这与您在问题中提到的GREL略有不同,因为它给出了错误)

6)此GREL的输出是OpenRefine数组.您需要将其转换为字符串以将输出存储在单元格中 – 因此您可能需要使用以下内容:

forEach(value.parseJson(),v,v.resource).join("|")
点赞