- 
                Notifications
    You must be signed in to change notification settings 
- Fork 7
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:
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 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:
{
  "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:
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:
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?