python - 给定一个字符串,如何返回 json 路径?

标签 python json python-2.7 list parsing

我在这里面临一个问题,因为我必须接收一个 json,其中包含一个字符串,其中包含另一个 json 中某些数据的路径。

  1. 包含一些数据的 Json

    json1 = {
        "Items": [{
                      "building": "buildingA",
                      "y": [1, 2, 3],
                      "yl": "A,B,C",
                      "xl": "Data",
                      "x": [1, 2, 3]
                  },
                  {
                      "y": [4, 5, 6],
                      "x": [1, 2, 3],
                      "predio": "BuildingB",
                      "yl": "D,E,F",
                      "xl": "Data"
                  }]
    }
    
  2. 以及包含所需值的路径的 json:

    json2 = {
        "y": "y//1",
    }
    

我尝试编写此代码来解决问题:

def size2(a,i):
 x=a.split('//')
 y=len(x)
 if y ==1:
    return i[x[0]]
 elif y==2:
    return i[x[0]][x[1]]
 elif y==3:
    return i[x[0]][x[1]][x[2]]

y=json2['y']
for i in json1['Items']:
 print(i['y'][1])        #this way works
 print(size2(y,i))       #this way fails

错误信息是:

TypeERROR: list indices must be integers, not str

有人知道如何解决这个问题吗?

最佳答案

您可以这样做,假设由所有数字字符组成的任何路径组件都是整数序列索引:

def size2(y, i):
     obj = i
     for comp in ((int(z) if z.isdigit() else z) for z in y.split('//')):
        obj = obj[comp]
     return obj

y = json2['y']
for i in json1['Items']:
    print(size2(y, i))  # this way now works

通过使用内置的 reduce() 可以使 size2() 函数更加简洁。功能:

def size2(y, i):
    return reduce(lambda obj, v: obj[int(v) if v.isdigit() else v], y.split('//'), i)

关于python - 给定一个字符串,如何返回 json 路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44251567/

相关文章:

python - 如何使用 TensorFlow 和 python 在 MNIST 数据上创建 2 层神经网络

python - 使用 cx_freeze 将 .py 转换为可执行文件时出错

java - 等同于其他语言的 Scala IDE 工作表?

java - 在 java 中使用 JSON 到 bitbucket 服务器的 HTTP POST 返回 400 作为响应代码

c++ - 如何在 json-Glib 中打印 Jsonarray?

python-2.7 - 值错误 : cannot copy sequence with size 5 to array axis with dimension 2

python - RabbitMQ 基础发布

c# - 如何使用抽象类创建通用列表?

python在字符串中求解方程

python - 表示要存储在文本文件中的图形的最佳方式