我有一列内容如下:

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) 从 facet 中选择“true”以使用数组单元
5) 对于这些单元格,使用 GREL
forEach(value.parseJson(),v,v.resource)

(n.b. 这与您在问题中提到的 GREL 略有不同)

6) 这个 GREL 的输出是一个 OpenRefine 数组。您需要将其转换为字符串以将输出存储在单元格中 - 因此您可能需要使用以下内容:
forEach(value.parseJson(),v,v.resource).join("|")

关于json - 在 GREL 中解析多值 JSON (OpenRefine),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41502023/

10-09 08:53