如何在新的 OpenRefine 列中仅保存特定的 JSON 元素

How to save only specific JSON elements in a new OpenRefine column

{
    "business_id": "SQ0j7bgSTazkVQlF5AnqyQ",
    "full_address": "214 E Main St\nCarnegie\nCarnegie, PA 15106",
    "hours": {},
    "open": true,
    ** "categories": ["Chinese", "Restaurants"] ** ,
    "city": "Carnegie",
    "review_count": 9,
    "name": "Don Don Chinese Restaurant",
    "neighborhoods": ["Carnegie"],
    "longitude": -80.0849615,
    "state": "PA",
    "stars": 2.5,
    "latitude": 40.4083473,
    "attributes": {
        "Take-out": true,
        "Alcohol": "none",
        "Noise Level": "quiet",
        "Parking": {
            "garage": false,
            "street": false,
            "validated": false,
            "lot": false,
            "valet": false
        },
        "Delivery": true,
        "Has TV": true,
        "Outdoor Seating": false,
        "Attire": "casual",
        "Waiter Service": false,
        "Accepts Credit Cards": true,
        "Good for Kids": true,
        "Good For Groups": false,
        "Price Range": 1
    },
    "type": "business"
}

value.parseJson()['categories'] 将在 OpenRefine 中创建一个名为 'categories' 的新列,但是是否可以过滤并保留 'chinese' 作为唯一值并删除任何其他值?

在上面的例子中,GREL 表达式:

value.parseJson()['categories']

生成包含两个值的数组:

["Chinese", "Restaurants"]

您可以使用作用于数组的 GREL 表达式来操作它。例如,要 select 数组中的第一个值,您可以使用:

value.parseJson()['categories'][0]

这将 select 数组中的第一个条目(将表达式末尾方括号中的数字增加到 select 数组中的其他条目)

如果您想过滤数组中的特定值,您可以使用 'filter' 表达式:

filter(value.parseJson()['categories'],v,v=="Chinese")

这将生成一个新数组,其中只有单词 "Chinese"(在上例中)。要将其存储在新列中,您需要将数组转换为字符串:

filter(value.parseJson()['categories'],v,v=="Chinese").join("")

为了避免区分大小写的问题,以及 'Chinese' 在 'categories' 数组中出现不止一次的可能性,我会先将值转换为小写并删除重复数组在转换为字符串之前 - 所以你最终得到:

filter(forEach(value.parseJson()["categories"],v,v.toLowercase()),w,w=="chinese").uniques().join("")