adafruit / adafruit/Adafruit_CircuitPython_JSON_Stream
Odd (literally) issue with nested dictionaries from weather.gov API
- Lenguaje dominante
- Python
- Estrellas
- 2
- Forks
- 7
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
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?
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Línea de trabajo
Comienza reproduciendo el comportamiento del acceso anidado con el archivo hourly.json enlazado, el Python del sistema y adafruit_json_stream.load; después, inspecciona cómo se recorren los periodos y los diccionarios anidados. Se considera terminado cuando acceder a probabilityOfPrecipitation.value ya no omite ni detiene los periodos, y se conserva el comportamiento de streaming con bajo consumo de memoria.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- embedded-iot
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 38/100