如何使用JMESPath将两个数组(`keys`和`values`)组合成一个对象?

jag*_*ar3 7 jmespath

我有一个带有两个数组的JSON对象 - 一个keys数组和一个values数组,两者长度相同.使用jmespath,我想构造一个新对象,使用keys数组的值作为键,values数组的值作为值,就像array_combine在PHP中一样.

例如,这是输入:

{
    "keys": [
        "a",
        "b",
        "c"
    ],
    "values": [
        1,
        2,
        3
    ]
}
Run Code Online (Sandbox Code Playgroud)

这是我期待的输出:

{
    "a": 1,
    "b": 2,
    "c": 3
}
Run Code Online (Sandbox Code Playgroud)

有没有内置功能来实现这一目标?

Sai*_*olu -1

jmespath是用于解析/查询 JSON 文件的流行库。更多示例请参见http://jmespath.org/tutorial.html

在下面的代码中

  • js是提供的json内容
  • jp.search('keys',json.loads(js)) 生成列表:[u'a', u'b', u'c']
  • jp.search('values',json.loads(js)) 生成列表:[1, 2, 3]
  • zip组合两个列表,dict()将元组转换为字典

    import json
    import jmespath
    
    js = '''{
            "keys": [
                    "a",
                    "b",
                    "c"
                    ],
            "values": [
                    1,
                    2,
                    3
                      ]
            }'''
    
    print (dict(zip(jp.search('keys',json.loads(js)),jp.search('values',json.loads(js)))))
    
    Run Code Online (Sandbox Code Playgroud)

    输出:{u'a':1,u'c':3,u'b':2}

  • @Sai,我很欣赏您的努力,但我一直在寻找一种仅使用 jmespath 的解决方案,而您的解决方案使用 Python 来压缩两个数组。想要仅使用 jmespath 的方法的原因是我想构建一个 API,用户可以在其中提供 jmespath 脚本来根据自己的喜好重塑 JSON 响应,而不会通过执行任意 Python 代码来损害服务器。 (3认同)
  • 请考虑添加一些措辞来解释您对代码所做的事情。 (2认同)