0

Im Trying to accesss to 'dataset' in 'protocol1' or to 'zeile' which is in 'log' which is in 'protocol1'. But i cant get make it working.

I tried it with nested for loops but i dont work.

This is my JSON File.

{
    "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"
                    }
                ]
        }
    ]
}

Does maybe someone know how? Im using flask which is jinja2.


Before it was like this

{
    "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"
        }
    ]
}

And i could get access this JSON with this html code

{% 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 %}

the python code which is returning the json file is this

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)

I hope you can help me with that, thanks in advance

2
  • What problem you get? Commented Feb 10, 2021 at 9:27
  • i cant get the inputs from 'protocol1' i want to display the attributes from it. for example 'dataset': 'Testdataset1' how im gonna print it in html Commented Feb 10, 2021 at 9:49

1 Answer 1

1

Instead of solving problem with jinja2 you can simplify your data. Here is the code I used to simplify your 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 dictionary will look like this after running this code:

{
    '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']}}
}

Then you can simply grab all data you need with jinja2 easily:

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))

Finally, the result will look like:

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']
Sign up to request clarification or add additional context in comments.

2 Comments

thank you very much, that was the solution
Hello last 14 days i was very busy with university and stuff, and now im working at it again. I found out that the way it displayed is not the aim. I hope that maybe can help me out with that again. each 'zeile' should have his own row with each other entry of 'methode', 'language1' and 'language2'

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.