【问题标题】:Access specific JSON Data访问特定的 JSON 数据
【发布时间】:2021-02-10 09:17:50
【问题描述】:

我正在尝试访问“protocol1”中的“dataset”或“protocol1”中的“log”中的“zeile”。但我无法让它工作。

我尝试使用嵌套的 for 循环,但我不工作。

这是我的 JSON 文件。

{
    "data": [
        {
            "protocol1": {
                    "dataset": "Testdataset1",
                    "eingangssprache": "Testeingangssprache1",
                    "ausgangssprache": "Testausgangssprache1",
                    "start": "13/01/2021 04:22 1",
                    "end": "14/01/2021 16:20 1"
                },
                    "log": [
                    {
                        "zeile": "01",
                        "methode": "lang detect",
                        "language1": "german",
                        "language2": "english"
                    },
                    {
                        "zeile": "02",
                        "methode": "lang detect",
                        "language1": "german",
                        "language2": "english"
                    },
                    {
                        "zeile": "03",
                        "methode": "lang detect",
                        "language1": "german",
                        "language2": "english"
                    }
                    ]
                },
        {
            "protocol2": {
                    "dataset": "Testdataset2",
                    "eingangssprache": "Testeingangssprache1",
                    "ausgangssprache": "Testausgangssprache1",
                    "start": "13/01/2021 04:22 1",
                    "end": "14/01/2021 16:20 1"
            },
                "log": [
               {
                        "zeile": "01",
                        "methode": "lang detect es",
                        "language1": " es",
                        "language2": "english es"
                    },
                    {
                        "zeile": "01",
                        "methode": "lang detect",
                        "language1": "german es",
                        "language2": "engli essh"
                    },
                    {
                        "zeile": "01",
                        "methode": "lang dete esct",
                        "language1": "germa esn",
                        "language2": "engli essh"
                    }
                ]
        }
    ]
}

也许有人知道怎么做? 我使用的是 jinja2 的烧瓶。


以前是这样的

{
    "data": [
        {
            "ausgangssprache": "Testout",
            "dataset": "Test",
            "eingangssprache": "Testin",
            "end": "14/01/2021 00:00",
            "start": "13/01/2021 04:22",
            "zeile": "45",
            "methode": "language detection",
            "language1": "Testin",
            "language2": "TestLlang",
            "zusammenfassung": "Zsf"
        }
    ]
}

我可以使用这个 html 代码访问这个 JSON

{% for i in data_protocol %}
                                    <tr>
                                        <td>{{ i.dataset }}</td>
                                        <td>{{ i.eingangssprache }}</td>
                                        <td>{{ i.ausgangssprache }}</td>
                                        <td>{{ i.start }}</td>
                                        <td>{{ i.end }}</td>

                                        <td>
......stuff ...
                                    {% endfor %}

返回 json 文件的 python 代码是这样的

json_file = open("data/table.json", "r")
    data = json.load(json_file)
    json_file.close()
    data = data['data']
    return render_template('index.html',
                           column_names=['Dataset', 'Eingangssprache', 'Ausgangssprache', 'Startzeit', 'Endzeit', 'LOG'],
                           data_protocol=data)

希望你能帮我解决这个问题,在此先感谢

【问题讨论】:

  • 遇到什么问题?
  • 我无法从“protocol1”获取输入,我想从中显示属性。例如 'dataset': 'Testdataset1' 我将如何在 html 中打印它

标签: python json flask


【解决方案1】:

您可以简化数据,而不是使用jinja2 解决问题。这是我用来简化您的data_set的代码:

total_dict = {}
for count, element in enumerate(data_set['data']):
    cleaned_data = {}
    for value in element.values():
        if type(value) == dict:
            cleaned_data['dataset'] = value['dataset']
            cleaned_data['eingangssprache'] = value['eingangssprache']
            cleaned_data['ausgangssprache'] = value['ausgangssprache']
            cleaned_data['start'] = value['start']
            cleaned_data['end'] = value['end']
            pass
        elif type(value) == list:
            # Store corresponding elements in one zeile_list
            zeile_list = []
            for i in value:
                # Adding all properties for each zeile
                each_list = [i['zeile'], i['methode'], i['language1'], i['language2']]
                zeile_list.append(each_list)
            
            zeile_dict = {}
            # Adding number and value of each_zeile to dictionary
            for i, v in enumerate(zeile_list):
                zeile_dict[i + 1] = v
            
            cleaned_data['zeile'] = zeile_dict
            
    
    total_dict[str(count)] = cleaned_data

total_dict 字典在运行此代码后将如下所示:

{
    '0': {
        'dataset': 'Testdataset1', 
        'eingangssprache': 'Testeingangssprache1', 
        'ausgangssprache': 'Testausgangssprache1', 
        'start': '13/01/2021 04:22 1', 
        'end': '14/01/2021 16:20 1', 
        'zeile': {
            1: ['01', 'lang detect', 'german', 'english'], 
            2: ['02', 'lang detect', 'german', 'english'], 
            3: ['03', 'lang detect', 'german', 'english']}}, 
    '1': {
        'dataset': 'Testdataset2', 
        'eingangssprache': 'Testeingangssprache1', 
        'ausgangssprache': 'Testausgangssprache1', 
        'start': '13/01/2021 04:22 1', 
        'end': '14/01/2021 16:20 1', 
        'zeile': {
            1: ['01', 'lang detect es', ' es', 'english es'], 
            2: ['01', 'lang detect', 'german es', 'engli essh'], 
            3: ['01', 'lang dete esct', 'germa esn', 'engli essh']}}
}

然后您就可以使用jinja2 轻松获取您需要的所有数据:

total_dict = {
    ....
}
t = jinja2.Template('''
        {% for data in total_dict.values() %}
            dataset -- {{ data['dataset'] }}
            ...
            {% for zeile_key, zeile_values in data['zeile'].items()%}
                zeile{{zeile_key}} -- {{zeile_values}}
            {% endfor %}
        {% endfor %}
''')
print(t.render(total_dict=total_dict))

最后,结果如下:

dataset -- Testdataset1
...
            
zeile1 -- ['01', 'lang detect', 'german', 'english']
zeile2 -- ['02', 'lang detect', 'german', 'english']
zeile3 -- ['03', 'lang detect', 'german', 'english']
            
dataset -- Testdataset2
...
zeile1 -- ['01', 'lang detect es', ' es', 'english es']
zeile2 -- ['01', 'lang detect', 'german es', 'engli essh']
zeile3 -- ['01', 'lang dete esct', 'germa esn', 'engli essh']

【讨论】:

  • 非常感谢,这就是解决方案
  • 您好,过去 14 天我忙于大学和其他事情,现在我又开始工作了。我发现它显示的方式不是目标。我希望这也许可以再次帮助我。每个 'zeile' 都应该有自己的行,每个条目都有 'methode'、'language1' 和 'language2'
猜你喜欢
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多