一尘不染

如何通过键查找特定的json值?

json

有一个像这样的json:

{
  "P1": "ss",
  "Id": 1234,
  "P2": {
      "P1": "cccc"
  },
  "P3": [
      {
          "P1": "aaa"
      }
  ]
}

如何在P1不迭代所有json的情况下找到all 的值?

PS:P1可以在json中的任何位置。

如果没有方法可以做到这一点,您能告诉我如何遍历json吗?


阅读 339

收藏
2020-07-27

共1个答案

一尘不染

我对这个问题的处理方式会有所不同。

由于JSON不允许深度优先搜索,因此将json转换为Python对象,将其提供给XML解码器,然后提取要搜索的Node

from xml.dom.minidom import parseString
import json        
def bar(somejson, key):
    def val(node):
        # Searches for the next Element Node containing Value
        e = node.nextSibling
        while e and e.nodeType != e.ELEMENT_NODE:
            e = e.nextSibling
        return (e.getElementsByTagName('string')[0].firstChild.nodeValue if e 
                else None)
    # parse the JSON as XML
    foo_dom = parseString(xmlrpclib.dumps((json.loads(somejson),)))
    # and then search all the name tags which are P1's
    # and use the val user function to get the value
    return [val(node) for node in foo_dom.getElementsByTagName('name') 
            if node.firstChild.nodeValue in key]

bar(foo, 'P1')
[u'cccc', u'aaa', u'ss']
bar(foo, ('P1','P2'))
[u'cccc', u'cccc', u'aaa', u'ss']
2020-07-27