代码之家  ›  专栏  ›  技术社区  ›  Javier Buzzi

用jq正确解析数据

  •  1
  • Javier Buzzi  · 技术社区  · 6 年前

    我有以下数据:

    [
        {
            "M": [
                {
                    "id": 1,
                    "nk": "MATH$$SPRING$$INST1$$2",
                    "section": {
                        "nk": "MATH$$SPRING$$INST1",
                        "course": 1,
                        "id": 1
                    },
                    "location": {
                        "id": 1,
                        "nk": "mcu$$101",
                        "campus": {
                            "id": 1,
                            "nk": "mcu",
                            "name": "Main Campus"
                        },
                        "address": "1 st",
                        "building": "1",
                        "room": "101"
                    },
                    "day_of_week": 2,
                    "start_time": "09:00:00",
                    "end_time": "10:00:00"
                },
                {
                    "id": 3,
                    "nk": "ENG$$SPRING$$INST2$$2",
                    "section": {
                        "nk": "ENG$$SPRING$$INST2",
                        "course": 2,
                        "id": 4
                    },
                    "location": {
                        "id": 2,
                        "nk": "mcu$$201",
                        "campus": {
                            "id": 1,
                            "nk": "mcu",
                            "name": "Main Campus"
                        },
                        "address": "1 st",
                        "building": "1",
                        "room": "201"
                    },
                    "day_of_week": 2,
                    "start_time": "09:00:00",
                    "end_time": "10:00:00"
                },
                {
                    "id": 4,
                    "nk": "ENG$$SPRING$$INST2$$22",
                    "section": {
                        "nk": "ENG$$SPRING$$INST2",
                        "course": 2,
                        "id": 4
                    },
                    "location": {
                        "id": 2,
                        "nk": "mcu$$201",
                        "campus": {
                            "id": 1,
                            "nk": "mcu",
                            "name": "Main Campus"
                        },
                        "address": "1 st",
                        "building": "1",
                        "room": "201"
                    },
                    "day_of_week": 2,
                    "start_time": "10:00:00",
                    "end_time": "11:00:00"
                }
            ]
        },
        {
            "W": [
                {
                    "id": 2,
                    "nk": "MATH$$SPRING$$INST1$$4",
                    "section": {
                        "nk": "MATH$$SPRING$$INST2",
                        "course": 1,
                        "id": 2
                    },
                    "location": {
                        "id": 2,
                        "nk": "mcu$$201",
                        "campus": {
                            "id": 1,
                            "nk": "mcu",
                            "name": "Main Campus"
                        },
                        "address": "1 st",
                        "building": "1",
                        "room": "201"
                    },
                    "day_of_week": 4,
                    "start_time": "08:00:00",
                    "end_time": "10:00:00"
                }
            ]
        }
    ]
    

    我在试着提取“W”的名单。

    当我这样做时: jq('[.[].W][]').transform(data) 我一个也得不到,但当我得到的时候 jq('[.[].M][]').transform(data) 我得到了想要的结果为什么我要经历这些?

    1 回复  |  直到 6 年前
        1
  •  2
  •   peak    6 年前

    我在试着提取“W”的名单。

    好吧,我们先讨论jq,然后再讨论python接口。

    JQ公司

    .[] 生成顶级数组中的所有项,因此 .[] | .W 将产生两个项目:

    • null (因为第一项没有.W),并且
    • 所需列表

    要只提取“w”的列表,可以使用以下任何过滤器, 根据您的具体要求:

    .[] | select(has("W")) | .W
    
    .[] | .W | select(.)
    
    .[] | .W // empty
    
    .[1].W
    

    从jq导入jq

    如文件所示 https://pypi.org/project/pyjq/ 说:

    如果multiple_output为false(默认值),则使用第一个输出

    例如:

    print jq('1,2').transform(data)
    

    只会产生 1 是的。

    总结

    根据具体要求,您可以使用上面给出的任何过滤器,例如:

    jq('.[] | .W // empty').transform(data)
    

    道德的

    如果这个故事有一个寓意的话,可能是,当有疑问时,应该考虑使用jq(命令行可执行文件)或jqplay来确保jq过滤器正在做您想要的事情。