Python中的JSON数组循环

ut6juiuv  于 2023-08-08  发布在  Python
关注(0)|答案(2)|浏览(116)

我想在我的JSON文件中的一个部分上循环,并根据文件中的名称渲染几何体。第一个月

import json

data = json.load(open('src/test.json'))

for geo in data["geometry"]:
    if geo == "rect":
       Geometry.rectangle(draw=pen, x=geo["x"], y=geo["y"], width=geo["width"],
                       height=geo["height"], rgb=geo["color"]

字符串
src/test.json(略简化)

{
  "geometry": {
    "rect": {
      "x": 10,
      "y": 10,
      "width": 40,
      "heigth": 40,
      "color": {
        "r": 255,
        "g": 100,
        "b": 0
      }
    },
    "ellipse": {
      "x": 200,
      "y": 100,
      "width": 400,
      "heigth": 400,
      "color": {
        "r": 0,
        "g": 255,
        "b": 0
      }
    },
    "polygon": {
      "x": 200,
      "y": 100,
      "radius": 200,
      "sites": 8,
      "rotation": 90,
      "color": {
        "r": 0,
        "g": 255,
        "b": 0
      }
    },
    "text": {
      "x": 200,
      "y": 100,
      "size": 20,
      "text": "jklsajflksdjf",
      "words_per_line": 20,
      "id": "text_1",
      "align": "right",
      "color": {
        "r": 0,
        "g": 255,
        "b": 0
      },
      "font_style": "monospace"
    }
  }
}


每次我执行这段代码,生病得到这个错误:

print(geo["rect"])
          ^^^^^^^^^^
TypeError: string indices must be integers, not 'str'


我用索引试过了,比如geo[0],但它返回了字符串的第一个字符,"rect" -> "r",有没有办法从几何体中获取值?

yrdbyhpb

yrdbyhpb1#

一旦json被加载,它就被表示为python中的字典。在python中循环一个字典,你就可以从字典中得到键,到目前为止,你的代码是正确的:

for geo in data["geometry"]:
    if geo == "rect":
        print("Rectangle")

字符串
如果要获取属于此几何的数据,可以询问原始数据

for geo in data["geometry"]:
    if geo == "rect":
        print("Rectangle", data["geometry"][geo])


或者更好的方法是使用items()迭代器,它将键和值直接作为元组提供给您

for geo_name, geo_data in data["geometry"].items():
    if geo_name == "rect":
        print("Rectangle", geo_data)
        Geometry.rectangle(draw=pen, x=geo_data["x"], y=geo_data["y"], width=geo_data["width"],
                           height=geo_data["height"], rgb=geo_data["color"]

utugiqy6

utugiqy62#

看看你的数据我稍微调整一下你的脚本。你可以使用dict.get来检查形状是否存在,而不是循环和比较字符串:

import json

with open('your_data.json', 'r') as f_in:
    data = json.load(f_in)

geo = data['geometry']

# draw rect:
if (shape:=geo.get('rect')):
    print('Rect', shape['x'], shape['y'])

# draw ellipse
if (shape:=geo.get('ellipse')):
    print('Ellipse', shape['x'], shape['y'])

# ...

字符串
印刷品:

Rect 10 10
Ellipse 200 100

相关问题