[Python] JSON uitlezen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 30-06 16:25
Hallo,

Ik probeer een JSON uit te lezen maar ik kom er niet helemaal aan uit en ik loop al vaker hier tegenaan.

De JSON:

Afbeeldingslocatie: https://tweakers.net/i/zqh5et-4wiwtqmNKJJgU0xhBFm0=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/1MsjLR0F8VvTi7X8Fa0DNhUa.png?f=user_large

Deel van de Python code:
Afbeeldingslocatie: https://tweakers.net/i/_jJzlhcG03FUwk7I4vHlAoh23Tc=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/c0Zwmor2TaFYTtRBFcPg2Nlc.png?f=user_large

De output:
Afbeeldingslocatie: https://tweakers.net/i/6a2IVXdhDfn2vwet4xn01VnjtM0=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/uMCOcilnww5c8wVwWGDqsHcX.png?f=user_large

Documentatie:
https://reqbin.com/code/p...python-parse-json-example

Hij zegt dus KEY ERROR maar welke is dan de KEY?

Het doel is om (voor nu) de naam terug te krijgen (COURANT) uit de JSON. Als me dat lukt dan weet ik hoe de opbouw moet en dan (denk ik) lukt me de rest zelf wel.

Alle reacties


Acties:
  • +4 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 14:35

Twazerty

AVCHDCoder developer

Volgens mij mis je een level:

data['data']['budget']['name']

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Stroopwafels
  • Registratie: September 2009
  • Laatst online: 30-06 20:35
Print eens eerst data zodat je ziet hoe de structuur eruit ziet. Dan zal je zien dat het data['data']['budget']['name'] is.

Acties:
  • 0 Henk 'm!

  • Puch-Maxi
  • Registratie: December 2003
  • Laatst online: 30-06 19:31
Ik heb niet goed gelezen.

[ Voor 89% gewijzigd door Puch-Maxi op 26-04-2023 14:57 ]

My favorite programming language is solder.


Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 30-06 16:25
Twazerty schreef op woensdag 26 april 2023 @ 14:38:
Volgens mij mis je een level:

data['data']['budget']['name']
Ik was ZOOO dichtbij -O-

thanks!!!

Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 30-06 16:25
Als ik nou meerdere id's heb. Hoe kan ik dan de juiste kiezen? Bij accounts bijvoorbeeld.
Zeg dat ik de naam wil van het eerste ID ?

Voorbeeld:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
{
    "data": {
        "budget": {
            "id": "2a7d60c4-1b1f-40ca-9377-xxxxx",
            "name": "Courant",
            "last_modified_on": "2023-04-26T11:55:19+00:00",
            "date_format": {
                "format": "DD-MM-YYYY"
            },
            "currency_format": {
                "iso_code": "EUR",
                "example_format": "123.456,78",
                "decimal_digits": 2,
                "decimal_separator": ",",
                "symbol_first": true,
                "group_separator": ".",
                "currency_symbol": "€",
                "display_symbol": true
            },
            "first_month": "2023-04-01",
            "last_month": "2023-05-01",
            "accounts": [
                {
                    "id": "32148fae-2671-4465-9f8d-XXXX",
                    "name": "Spaar",
                    "type": "savings",
                    "on_budget": true,
                    "closed": false,
                    "note": null,
                    "balance": 22
                    "cleared_balance": 22XXX,
                    "uncleared_balance": 0,
                    "transfer_payee_id": "9a3f1ff2-dc8e-47d8-88cd-d49d90b54ed1",
                    "direct_import_linked": false,
                    "direct_import_in_error": false,
                    "last_reconciled_at": null,
                    "debt_original_balance": null,
                    "debt_interest_rates": {},
                    "debt_minimum_payments": {},
                    "debt_escrow_amounts": {},
                    "deleted": false
                },
                {
                    "id": "accd980e-aea7-44c3-a1c6-9c3329d4c4cd",
                    "name": "Hypotheek",
                    "type": "mortgage",
                    "on_budget": false,
                    "closed": false,
                    "note": null,
                    "balance": XXXX,
                    "cleared_balance": XXXX,
                    "uncleared_balance": 0,
                    "transfer_payee_id": "10e47ba9-69bc-486c-9132-a01f4e6fa29d",
                    "direct_import_linked": false,
                    "direct_import_in_error": false,
                    "last_reconciled_at": null,
                    "debt_original_balance": 0,
                    "debt_interest_rates": {
                        "2023-04-01": 2540
                    },
                    "debt_minimum_payments": {
                        "2023-04-01": 1137000
                    },
                    "debt_escrow_amounts": {
                        "2023-04-01": 0
                    },
                    "deleted": false
                },



Edit:

Ik denk dat het zo moet:

code:
1
2
levensmiddelen_restant = data['data']['budget']['categories'][0]['name']
print(levensmiddelen_restant)


Maar dit is dus erg afhankelijk van de volgorde van de json, klopt dat? Als die wijzigt dan wijzigt ook mijn output?

[ Voor 5% gewijzigd door ironheart op 26-04-2023 15:22 ]


Acties:
  • 0 Henk 'm!

  • Stroopwafels
  • Registratie: September 2009
  • Laatst online: 30-06 20:35
ironheart schreef op woensdag 26 april 2023 @ 15:16:
.....


Edit:

Ik denk dat het zo moet:

code:
1
2
levensmiddelen_restant = data['data']['budget']['categories'][0]['name']
print(levensmiddelen_restant)


Maar dit is dus erg afhankelijk van de volgorde van de json, klopt dat? Als die wijzigt dan wijzigt ook mijn output?
Dat klopt, daarom moet je hopen dat de API die je gebruikt aan een versie vastzit waar geen output verandering aan worden gemaakt.

[ Voor 73% gewijzigd door Stroopwafels op 26-04-2023 15:26 ]


Acties:
  • 0 Henk 'm!

  • CyBeRSPiN
  • Registratie: Februari 2001
  • Nu online

CyBeRSPiN

sinds 2001

Je zou https://pypi.org/project/pyjq/ kunnen gebruiken en dan met een
pyjq.first('. | select(.accountId == $id',...)

Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 30-06 16:25
Ok dus ik moet op INDEX (nummer) zoeken naar mijn juiste waarde? als er een ID wordt toegevoegd dan verschuift dus alles en moet ik mijn code opnieuw nalopen. Kan ik niet zoeken op NAME of ID en dan de bijbehorende waarde erbij zoeken?

Acties:
  • 0 Henk 'm!

  • JackBol
  • Registratie: Maart 2000
  • Niet online

JackBol

Security is not an option!

Als je die JSON dumpt, is het gewoon een geneste dict. Als ik niet zeker ben van de volgorde dump ik de subtree in een nieuwe dict en gebruik de key/value functionaliteiten die een dict standaard biedt om met de juiste data te werken.

De actuele opbrengst van mijn Tibber Homevolt


Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 30-06 16:25
Ja dat ga ik ook doen, ik lees hem eerst helemaal uit denk ik met een while lus.
Echter, hoe kom ik erachter wat de lengte is van de json? of te wel:

code:
1
2
i=0
While i < ?:

Acties:
  • 0 Henk 'm!

  • Ben(V)
  • Registratie: December 2013
  • Laatst online: 14:36
Dat hoef je niet te weten.
Je loopt er gewoon met een for loop doorheen.
dus iets van:

code:
1
for Account in data['data']['budget']['accounts']:

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.


Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 30-06 16:25
code:
1
2
for naam in data['data']['budget']['categories']['name']:
    print(naam)



Dit lijkt me niet te kloppen, krijg een rare output.

[ Voor 5% gewijzigd door ironheart op 26-04-2023 16:08 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Als je eens begint met duidelijk te zijn. Wat is "rare"? Laat eens een voorbeeld zien, of omschrijf wat je krijgt en wat je verwacht(te). "Rare output" kan niemand iets mee ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • +1 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 25-06 06:51
Er is trouwens ook een directe json parser in Requests aanwezig :)

Python:
1
json_data = response.json()

https://www.geeksforgeeks.org/response-json-python-requests/

[ Voor 5% gewijzigd door FireDrunk op 26-04-2023 16:14 ]

Even niets...


Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 30-06 16:25
Ben(V) schreef op woensdag 26 april 2023 @ 15:51:
Dat hoef je niet te weten.
Je loopt er gewoon met een for loop doorheen.
dus iets van:

code:
1
for Account in data['data']['budget']['accounts']:
code:
1
2
3
for name in data['data']['budget']['categories']:
    print(name)
    print()


resulteert in:

code:
1
2
3
{'id': '0ba201ca-f023-4078-8c12-2ecb4b7f02c3', 'category_group_id': 'bc824802-0d01-442c-b443-2a60f6c9b72c', 'name': 'Entertainment', 'hidden': False, 'original_category_group_id': None, 'note': None, 'budgeted': 0, 'activity': 0, 'balance': 0, 'goal_type': 'NEED', 'goal_day': 6, 'goal_cadence': 2, 'goal_cadence_frequency': 1, 'goal_creation_month': None, 'goal_target': 0, 'goal_target_month': None, 'goal_percentage_complete': None, 'deleted': True}

{'id': '8c01e651-a680-45dc-b661-b9102d470399', 'category_group_id': 'bc824802-0d01-442c-b443-2a60f6c9b72c', 'name': 'Health & Wellness', 'hidden': False, 'original_category_group_id': None, 'note': None, 'budgeted': 0, 'activity': 0, 'balance': 0, 'goal_type': 'NEED', 'goal_day': None, 'goal_cadence': 1, 'goal_cadence_frequency': 1, 'goal_creation_month': None, 'goal_target': 0, 'goal_target_month': None, 'goal_percentage_complete': None, 'deleted': True}


echter:

code:
1
2
3
for name in data['data']['budget']['categories']['name']:
    print(name)
    print()


resulteert in:
code:
1
2
3
4
Traceback (most recent call last):
  File "/home/ricardo/ynab_budget.py", line 35, in <module>
    for name in data['data']['budget']['categories']['name']:
TypeError: list indices must be integers or slices, not str

Acties:
  • 0 Henk 'm!

  • BeefHazard
  • Registratie: Augustus 2010
  • Laatst online: 30-06 18:00
ironheart schreef op woensdag 26 april 2023 @ 16:14:
[...]


code:
1
2
3
for name in data['data']['budget']['categories']:
    print(name)
    print()


resulteert in:

code:
1
2
3
{'id': '0ba201ca-f023-4078-8c12-2ecb4b7f02c3', 'category_group_id': 'bc824802-0d01-442c-b443-2a60f6c9b72c', 'name': 'Entertainment', 'hidden': False, 'original_category_group_id': None, 'note': None, 'budgeted': 0, 'activity': 0, 'balance': 0, 'goal_type': 'NEED', 'goal_day': 6, 'goal_cadence': 2, 'goal_cadence_frequency': 1, 'goal_creation_month': None, 'goal_target': 0, 'goal_target_month': None, 'goal_percentage_complete': None, 'deleted': True}

{'id': '8c01e651-a680-45dc-b661-b9102d470399', 'category_group_id': 'bc824802-0d01-442c-b443-2a60f6c9b72c', 'name': 'Health & Wellness', 'hidden': False, 'original_category_group_id': None, 'note': None, 'budgeted': 0, 'activity': 0, 'balance': 0, 'goal_type': 'NEED', 'goal_day': None, 'goal_cadence': 1, 'goal_cadence_frequency': 1, 'goal_creation_month': None, 'goal_target': 0, 'goal_target_month': None, 'goal_percentage_complete': None, 'deleted': True}


echter:

code:
1
2
3
for name in data['data']['budget']['categories']['name']:
    print(name)
    print()


resulteert in:
code:
1
2
3
4
Traceback (most recent call last):
  File "/home/ricardo/ynab_budget.py", line 35, in <module>
    for name in data['data']['budget']['categories']['name']:
TypeError: list indices must be integers or slices, not str
Je haalt keys en values een beetje door elkaar.

code:
1
2
for category in data['data']['budget']['categories']:
    print(category['name'])


Als je enkel de namen van de categorieën wil printen. Maar ik zie geen outline hoe categories eruitziet in jouw json, dus dat is een beetje giswerk.

R6 | 24-70 F2.8 DG OS HSM Art | 18-35 F1.8 DC HSM Art | EF 70-200 F4L IS USM | EF 50mm f/1.8 | Zenbook 14 OLED | T14G4 OLED


Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 30-06 16:25
BeefHazard schreef op woensdag 26 april 2023 @ 16:27:
[...]


Je haalt keys en values een beetje door elkaar.

code:
1
2
for category in data['data']['budget']['categories']
print(category['name'])


Als je enkel de namen van de categorieën wil printen. Maar ik zie geen outline hoe categories eruitziet in jouw json, dus dat is een beetje giswerk.
Thanks! het lukt me! Dank je wel voor je hulp.

Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 30-06 16:25
Is dit de beste manier om dit te doen?

code:
1
2
3
4
5
6
7
8
for category in data['data']['budget']['categories']:
    while category['name'] in budget_items:
        if category['deleted'] != True:
            budget_category = category['name']
            budget_balance = str(category['balance']/1000)
            budget_budgeted = str(category['budgeted']/1000)
            print(budget_category + ' - ' + budget_budgeted + ' - ' + budget_balance)
            break

Acties:
  • +2 Henk 'm!

  • BeefHazard
  • Registratie: Augustus 2010
  • Laatst online: 30-06 18:00
ironheart schreef op woensdag 26 april 2023 @ 16:52:
Is dit de beste manier om dit te doen?

code:
1
2
3
4
5
6
7
8
for category in data['data']['budget']['categories']:
    while category['name'] in budget_items:
        if category['deleted'] != True:
            budget_category = category['name']
            budget_balance = str(category['balance']/1000)
            budget_budgeted = str(category['budgeted']/1000)
            print(budget_category + ' - ' + budget_budgeted + ' - ' + budget_balance)
            break
Nee. :p
Maar hoe je dit zou herschrijven is een beetje lastig te zeggen zonder een goede outline van je JSON (immers, waar komt budget_items opeens vandaan?) en een idee van wat je wil doen. Algemeen Python advies:

- 'if category['deleted'] != True' kun je korter en duidelijker schrijven als 'if not category['deleted']'.
- Vanwaar de while loop? Als budget_items een lijst is van dingen die je wil selecteren en je wil ze matchen, is dat gewoon een conditie die je toe kan voegen aan je bestaande if. Het zoeken door 'budget_items' gebeurt dan al via het woordje 'in'.
- Als je niets doet met een variabele, zoals budget_category, heeft het ook niet veel zin om die op te slaan met een naam. Dan kun je ook gewoon category['name'] in je print statement zetten.

R6 | 24-70 F2.8 DG OS HSM Art | 18-35 F1.8 DC HSM Art | EF 70-200 F4L IS USM | EF 50mm f/1.8 | Zenbook 14 OLED | T14G4 OLED


Acties:
  • +2 Henk 'm!

  • Ben(V)
  • Registratie: December 2013
  • Laatst online: 14:36
Misschien moet je eerst eens inlezen hoe een geneste dict in elkaar zit.
Lees ook eens over dict.values() en dict.items() en hoe je met keys en values in een loop kunt omgaan.

Want wat je nu doet is "try and error" in plaats van begrijpen.

PS "while" loops zijn in Python altijd overbodig alles kan netjes met "for" loops en leest ook veel beter.

[ Voor 33% gewijzigd door Ben(V) op 27-04-2023 12:38 ]

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.

Pagina: 1