синтаксический анализ строки как dict во вложенном json документе - PullRequest
1 голос
/ 19 июня 2020

В моем приложении flask я получаю ответ json от внешнего вызова API с вложенными документами. Я заметил, что одно из полей во вложенном документе - это строка, которую я хотел бы проанализировать как словарь, чтобы я мог извлечь поля на моей html странице?

import json
from flask import Flask, render_template, jsonify
import requests

app = Flask(__name__)

@app.route('/')
def index():

    url = "http://remote-server/v1/info"
    params = {"offset":0,"limit":10}
    response = requests.post(url, json=params)
    data = response.json()

    print(data)
    ''' 
    >>
    [
        {
            "full_name": "John Doe",
            "email": "jdoe@example.com",
            "content": '{"count":10, "info": {"foo": "bar", "location": "LA"}, "items":["A", "B", "C"]}'
        }
    ]
    '''

    for item in data:
      print(type(item[content]))
    '''
    >>
    <class 'str'>
    '''  
    return render_template('index.html', data=data)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

Я хочу иметь возможность извлеките content вот так в моем html:

# -- index.html
<div>          
  {% for doc in data %}
    <div class="user_info">{{ doc['full_name'] }}</div>
    <div class="user_info">{{ doc['email']  }}</div>
    <div class="user_info">{{ doc['content']['info']['foo'] }}</div>
    <div class="user_info">{{ doc['content']['info']['location'] }}</div>

    {% for item in doc.content.items %}
       <div>{{ item }}</div>
    {% endfor %}   

  {% endfor %}
</div>

1 Ответ

0 голосов
/ 19 июня 2020

Вы почти у цели. Как-то странно, что сервер отвечает неверным json. В любом случае, двойная проверка, заменив '{ на { и }' на }, не испортит ситуацию. Я немного изменил ваш пример, как показано ниже:

import json
from flask import Flask, render_template_string


app = Flask(__name__)


@app.route('/')
def index():
    template = """
        <div>
          {% for doc in data %}
            <div class="user_info">{{ doc['full_name'] }}</div>
            <div class="user_info">{{ doc['email']  }}</div>
            <div class="user_info">{{ doc['content']['info']['foo'] }}</div>
            <div class="user_info">{{ doc['content']['info']['location'] }}</div>

            {% for item in doc.content.items() %}
               <div>{{ item }}</div>
            {% endfor %}
          {% endfor %}
        </div>
        """

    payload = """
    [
        {
            "full_name": "John Doe",
            "email": "jdoe@example.com",
            "content": '{"count":10, "info": {"foo": "bar", "location": "LA"}, "items":["A", "B", "C"]}'
        }
    ]
    """.replace("'{", "{").replace("}'", "}")

    data = json.loads(payload)
    return render_template_string(template, data=data)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

...