Срез против отдельного объекта
Вы объявляете фрагмент:
var sensorData []Data
Но тогда ваша полезная нагрузка - это не массив, а только один объект:
{'sensor': 'DHT22', 'temperature': [22.7, 22.7, 22.8], 'humidity': [51.9, 52.0, 52.0]}
Таким образом, это сообщение об ошибке говорит о том, что он не может демонтировать один объект как срез.
Попробуйте изменить это объявление на:
var sensorData Data
Затем, вместо того, чтобы перебирать его, вам нужно просто проверить один экземпляр данных.
Дополнительные несоответствия между полезной нагрузкой и типом структуры
После этого вы, вероятно, получите еще одну ошибку, поскольку массивы temperature
и humidity
содержат десятичные числа:
`{'sensor': 'DHT22', 'temperature': [22.7, 22.7, 22.8], 'humidity': [51.9, 52.0, 52.0]`
Но вы объявляете их как int
фрагментов в вашем коде:
Temp []int `json: "temperature"`
Hum []int `json: "humidity"`
Так что вам нужно изменить их на []float64
Различение двух разных полезных нагрузок
Что касается разграничения двух типов объектов, было бы лучше, если бы вы попытались это сделать, но даже если вы этого не сделаете, библиотека Go json
будет игнорировать проблемы, если имена полей не совпадают, так что произойдет: что при десериализации ваших actuator
полезных нагрузок в Data
все поля будут иметь значения по умолчанию, но ошибки не будет получено.
Эта проверка, вероятно, выдаст panic
, потому что в этом случае массив будет пустым:
if i.Temp[2] > 20
Один "хакерский" способ решения этой проблемы - обработать данные, только если поле sensor
не является пустой строкой.
При условии, что вы всегда получаете имя датчика в сообщениях sensor
, единственный случай, когда это приведет к пустой строке, - это если вы только что обработали одно из других сообщений.