首页 > 解决方案 > 在 Django 中解析和循环多级 JSON 数据

问题描述

我有一个 Django 网站,我正在调用 Etsy 的 API 以在网站上显示产品。数据有多个级别(以下简称):

{
    "results":[
        {
            "title":"#020",
            "price":"5.99",
            "Images":[
                {
                    "url_570xN":"www.example.com/image1.jpg"
                }
            ]
        },
        {
            "title":"#051",
            "price":"5.99",
            "Images":[
                {
                    "url_570xN":"www.example.com/image2.jpg"

                }
            ]
        },
    ]
}

results我可以成功地从部件 ( title, )中提取数据price并将其显示在模板中,但我不知道如何为Images部件 ( url_570xN) 做同样的事情。我花了几个小时试图找到正确的语法,但我没有成功。

我的views.py

# Note: The commented lines are the ones giving me problems.
# Removing them yields no errors and displays the info I want,
# minus the images

def products(request):
    parsed_data = []
    response = requests.get('https://openapi.etsy.com/v2/shops/{SHOP_ID}/listings/active?includes=Images:1:0&api_key={KEY}')
    etsy_data = response.json()
    etsy_results = etsy_data['results']
    # etsy_images = etsy_data['results']['Images']

    for results in etsy_results:
        result_data = {}
        result_data['title'] = results['title']
        result_data['price'] = results['price']
        # for Images in etsy_images:
            # result_data['url_570xN'] = Images['url_570xN']
        parsed_data.append(result_data)

    return render(request, 'blog/products.html', {'data' : parsed_data})

我的products.html模板:

{% for result in data %}
    <p>Title: {{result.title}}
    Price: {{result.price}}
    <img src={{result.url_570xN}} width="200px"></p>
{% endfor %}

最后,取消注释我的行时收到的错误消息views.py

TypeError at /products/
list indices must be integers or slices, not str

任何帮助将非常感激。谢谢!

编辑1:这是我上面所拥有的完整追溯:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/products/

Django Version: 2.2.4
Python Version: 3.7.4
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'blog.apps.BlogConfig',
 'crispy_forms',
 'django_summernote']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/Users/MeganMcCarty/Documents/coding-projects/djangogirls/myvenv/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/Users/MeganMcCarty/Documents/coding-projects/djangogirls/myvenv/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "/Users/MeganMcCarty/Documents/coding-projects/djangogirls/myvenv/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/MeganMcCarty/Documents/coding-projects/djangogirls/blog/views.py" in products
  21.     etsy_images = etsy_data['results']['Images']

Exception Type: TypeError at /products/
Exception Value: list indices must be integers or slices, not str

编辑2:根据汤姆卡里克的回答,我改变了views.py如下。现在一切正常,非常感谢!

    parsed_data = []
    response = requests.get('https://openapi.etsy.com/v2/shops/{SHOP_ID}/listings/active?includes=Images:1:0&api_key={KEY}')
    etsy_data = response.json()
    etsy_results = etsy_data['results']

    for results in etsy_results:
        result_data = {}
        result_data['title'] = results['title']
        result_data['price'] = results['price']
        result_data['url_570xN'] = results['Images'][0]['url_570xN']
        parsed_data.append(result_data)

    return render(request, 'blog/products.html', {'data' : parsed_data})

标签: pythonjsondjango

解决方案


问题是图像不是直接在 下results,而是它们是每个项目的一部分,与title和处于同一级别price。也可以有多个图像,所以我在这里假设您只需要每个产品的第一个图像。

因此,您想要的是:

def products(request):
    parsed_data = []
    response = requests.get('https://openapi.etsy.com/v2/shops/{SHOP_ID}/listings/active?includes=Images:1:0&api_key={KEY}')
    etsy_data = response.json()
    etsy_results = etsy_data['results']

    for results in etsy_results:
        result_data = {}
        result_data['title'] = results['title']
        result_data['price'] = results['price']
        result_data['url_570xN'] = results['Images'][0]['url_570xN']
        parsed_data.append(result_data)

    return render(request, 'blog/products.html', {'data' : parsed_data})

推荐阅读