对象/数组中的FOR循环

sve*_*tlo 0 python

我正在使用python创建一个应用程序.我发出HTTP请求并获得以下结果:

{
    "companies": {
        "company": [
            {
                "createDt": "2014-01-18T00:00:00+01:00",
                "dbNazev": "sveatlo_s_r_o_",
                "id": "1",
                "licenseGroup": "null",
                "nazev": "Sveatlo s.r.o.",
                "show": "true",
                "stavEnum": "ESTABLISHED",
                "watchingChanges": "false"
            },
            {
                "createDt": "2014-01-20T00:00:00+01:00",
                "dbNazev": "hajocka",
                "id": "2",
                "licenseGroup": "null",
                "nazev": "HájoÄka",
                "show": "true",
                "stavEnum": "ESTABLISHED",
                "watchingChanges": "false"
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我在for循环中处理数据.问题是响应也可能如下所示:

{
    "companies": {
        "company": {
            "createDt": "2014-01-18T00:00:00+01:00",
            "dbNazev": "sveatlo_s_r_o_",
            "id": "1",
            "licenseGroup": "null",
            "nazev": "Sveatlo s.r.o.",
            "show": "true",
            "stavEnum": "ESTABLISHED",
            "watchingChanges": "false"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

目前我正在检查这样的每个请求后是否是一个数组,但我觉得这不是最好的方法.有人可以帮我找一个更好的解决方案吗?

谢谢你的回答.

编辑:我无法更改服务器的响应

Joe*_*ett 5

规范化您正在解析的信息.这可以防止你不得不重复自己:

假设您的数据可能如下所示:

some_json_data = {"companies": {"foo": 1}}
Run Code Online (Sandbox Code Playgroud)

或者像这样:

some_json_data = {"companies": [{"foo": 1}]}
Run Code Online (Sandbox Code Playgroud)

因此,当您解析json数据时,请执行以下操作:

i_expect_an_array = some_json_data['companies']
if not isinstance(i_expect_an_array, list):
    i_expect_an_array = (i_expect_an_array,)

# Now, you can process the data as you normally would
Run Code Online (Sandbox Code Playgroud)

不需要两个具有相似外观代码的独立块.

  • 元组比列表更快.服务器响应也不是多变的,因此更好的逻辑是不允许更改它. (2认同)