adafruit / adafruit/Adafruit_CircuitPython_JSON_Stream
Odd (literally) issue with nested dictionaries from weather.gov API
- 主要语言
- Python
- 星标
- 2
- 派生
- 7
- PR 合并指标
- 30 天内没有已合并 PR
描述
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?
贡献指南
这个仓库没有索引到贡献指南
调研方向
首先使用链接的 hourly.json 文件、系统 Python 和 adafruit_json_stream.load 重现嵌套访问行为,然后检查如何遍历时间段和嵌套字典。完成的标准是访问 probabilityOfPrecipitation.value 时不再跳过或停止时间段,同时保留低内存流式处理行为。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- python
- 领域
- embedded-iot
- Issue 类型
- 缺陷
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 38/100