adafruit / adafruit/Adafruit_CircuitPython_JSON_Stream

Odd (literally) issue with nested dictionaries from weather.gov API

Ouverte
#5 4 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
Python
Étoiles
2
Forks
7
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

I'm trying to fetch and parse https://api.weather.gov/gridpoints/BOX/71,90/forecast/hourly with a MatrixPortal, which does not have a lot of spare RAM. Things are basically working, but when I tried to add probability of precipitation to the data I'm fetching, I got a surprise — it's skipping every other list item.

The json in question is a dictionary with the data I want under the key `properties`. That key's value is another dictionary, which contains the key `periods`, which is a _list_ of more dictionaries. Parsing all this works fine as long as I'm simply reading key/value pairs in the right order:

```python
hourly_file = io.open("hourly.json",'rb')
json_data = adafruit_json_stream.load(hourly_file)
periods = json_data['properties']['periods']

for period in periods:
print(f"Number: {period['number']:03}")
print(f"Start: {period['startTime']}")
print(f"End: {period['endTime']}")
print(f"Temp: {period['temperature']} {period['temperatureUnit']}")
print(f"Forecast: {period['shortForecast']}")
```

For testing, I'm using the system python on Fedora Linux, with [hourly.json](https://github.com/adafruit/Adafruit_CircuitPython_JSON_Stream/files/15503026/hourly.json) pre-downloaded. But this is exactly the same problem I'm seeing on the MatrixPortal with CircuitPython 9.1. What problem? Well, each period looks something like this:

```json
{
"number": 1,
"name": "",
"startTime": "2024-05-30T12:00:00-04:00",
"endTime": "2024-05-30T13:00:00-04:00",
"isDaytime": true,
"temperature": 57,
"temperatureUnit": "F",
"temperatureTrend": null,
"probabilityOfPrecipitation": {
"unitCode": "wmoUnit:percent",
"value": 80
},
"dewpoint": {
"unitCode": "wmoUnit:degC",
"value": 10
},
"relativeHumidity": {
"unitCode": "wmoUnit:percent",
"value": 77
},
"windSpeed": "9 mph",
"windDirection": "N",
"icon": "https://api.weather.gov/icons/land/day/rain_showers,80?size=small",
"shortForecast": "Rain Showers",
"detailedForecast": ""
}
```
and if try to get at one of the further-nested values, that's when stuff gets weird. For example:

```python
for period in periods:
print(f"Number: {period['number']:03}")
print(f"Start: {period['startTime']}")
print(f"End: {period['endTime']}")
print(f"Temp: {period['temperature']} {period['temperatureUnit']}")
print(f"Rain%: {period['probabilityOfPrecipitation']['value']}")
print(f"Forecast: {period['shortForecast']}")
```

... _skips every other period_, printing (in this example) just the odd-numbered ones.

Or, if I remove any lookups for keys _after_ the nested item, like:

```python
for period in periods:
print(f"Number: {period['number']:03}")
print(f"Start: {period['startTime']}")
print(f"End: {period['endTime']}")
print(f"Temp: {period['temperature']} {period['temperatureUnit']}")
print(f"Rain%: {period['probabilityOfPrecipitation']['value']}")
#print(f"Forecast: {period['shortForecast']}")
```

... it stops after the _first_ period.

Is there a better way to do this?

Is there a way to turn the `Transient` "period" into a real dictionary on each step of the loop? That'll use more memory, but only temporarily. Or, for that matter, just `period['probabilityOfPrecipitation']`?

Or should I be doing something else altogether?

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Piste de recherche

Commencez par reproduire le comportement de l'accès imbriqué avec le fichier hourly.json lié, le Python du système et adafruit_json_stream.load, puis examinez comment les périodes et les dictionnaires imbriqués sont parcourus. Le travail est terminé lorsque l'accès à probabilityOfPrecipitation.value ne saute plus de périodes et ne les arrête plus, tout en préservant le comportement de streaming à faible consommation mémoire.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
embedded-iot
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
38/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.