【问题标题】:Loop through the array (key by key) | the keep checking each key by adding it to the path循环遍历数组(key by key) |通过将每个键添加到路径来不断检查每个键
【发布时间】:2020-10-15 09:47:38
【问题描述】:

我只是有一个想法,但不确定这是否可能(我真的希望有人可以帮助我)。

例如,如果我们有数组 - arr = ["a","b","c","d","e"]

我想使用上面的数组创建一个检查 JSON 路径的循环,如下所示:

def jsonLoop(loadedJson):

    arr = ["a","b","c","d","e"]

    for i in range(len(arr)):

        if jsonPathChecker(loadedJson,i,arr) is not False:
            return jsonPathChecker(loadedJson,i,arr)


def jsonPathChecker(loadedJson,i,arr):

    if i == 0:
        jv = loadedJson[arr[0]]
    elif i == 1:
        jv = loadedJson[arr[0]][arr[1]]
    elif i == 2:
        jv = loadedJson[arr[0]][arr[1]][arr[2]]
    elif i == 3:
        jv = loadedJson[arr[0]][arr[1]][arr[2]][arr[3]]
    elif i == 4:
        jv = loadedJson[arr[0]][arr[1]][arr[2]][arr[3]][arr[4]]
    elif i == 5:
        jv = loadedJson[arr[0]][arr[1]][arr[2]][arr[3]][arr[4]][arr[5]]

    if isinstance(jv, list):
        return jv # or return I so I will know where the array starts
    else:
        False
      

但我希望能够无限使用i,而不是创建一长串 if 语句

【问题讨论】:

  • 您检查if isinstance(jv, list): 有什么原因吗? json 路径可以以列表、数字、字符串、字典等结尾。路径存在并且您获得终止值还不够吗?
  • @DarrylG 我正在检查一个可以开始循环到更深层次的数组+这是另一个问题...

标签: python json loops for-loop


【解决方案1】:
def jsonPathChecker(loadedJson,i,arr):
    jv = loadedJson[arr[0]]
    for ix in range(1,i):
        jv = jv[arr[ix]]
    if isinstance(jv, list):
        return jv # or return I so I will know where the array starts
    else:
        False

【讨论】:

  • 对不起,如果我错了,请纠正我,但是您的解决方案不会向loadedJson添加密钥,而是只会检查第一个/第二个密钥并且它...
  • 请注意jv = jv[arr[ix]]。这意味着在每次迭代之后,您将在结构中更深一层。
  • 谢谢 不知道可以这样弄,(我就这行jv = jv[arr[ix]]
【解决方案2】:

如果我理解正确,您正在尝试减少if 的判断。 这个怎么样:

def jsonPathChecker(loadedJson,i,arr):
    
    jv_dict = {0: loadedJson[arr[0]], 
               1: loadedJson[arr[0]][arr[1]],
               2: loadedJson[arr[0]][arr[1]][arr[2]],
               3: loadedJson[arr[0]][arr[1]][arr[2]][arr[3]],
               4: loadedJson[arr[0]][arr[1]][arr[2]][arr[3]][arr[4]], 
               5: loadedJson[arr[0]][arr[1]][arr[2]][arr[3]][arr[4]][arr[5]]}
    
    jv = jv_dict[i]
    if isinstance(jv, list):
        return jv
    else:
        False

【讨论】:

  • 是的,但我希望将 jv_dict 转换为某种循环机制,这样如果我们有一条带有arr[100] 的路径,我就不需要添加大量代码......
  • @MR Sample 好的,也许Hugo Guillen 答案是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 2014-06-08
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多