Нормально, но нет предела совершенству)
Пропущенна проверка на ошибки после `err = json.Unmarshal(raw, &packet)`
так же, код можно упростить, если вложить структуру `RawDataSensorsItems` в `ResultRow`
Получим:
type ResultRow struct {
StreamId int `json:"stream_id"`
DateTime string `json:"date_time"`
RawDataSensorsItems
}
type RawDataSensorsItems struct {
AKey string `json:"a_key"`
BKey int `json:"b_key"`
SensorA *int `json:"sensor_a"`
SensorB *int `json:"sensor_b"`
SensorC *int `json:"sensor_c"`
SensorD *int `json:"sensor_d"`
SensorE *int `json:"sensor_e"`
SensorF *int `json:"sensor_f"`
}
Из за чего упроститься код внутри цикла:
result = append(
result,
ResultRow{
StreamId: row.StreamId,
DateTime: row.DateTime,
RawDataSensorsItems: rowS,
})
)
так же, можно использовать не простой `for j := range row.Sensors` по индексам, а сразу со значениями `for _, rowS := range row.Sensors` (игнорируем с помощью `_` индекс, а в `rowS` сразу записываем значение из массива)
Если так переписать, то получим:
for _, row := range packet {
for _, rowS := range row.Sensors {
result = append(
result,
ResultRow{
StreamId: row.StreamId,
DateTime: row.DateTime,
RawDataSensorsItems: rowS,
})
}
}
Полный кодpackage main
import (
"encoding/json"
"io/ioutil"
)
func main() {
raw, err := ioutil.ReadFile("./data/raw.json")
PanicIfErr(err)
var packet DataPacket
var result ResultPacket
err = json.Unmarshal(raw, &packet)
PanicIfErr(err)
for _, row := range packet {
for _, rowS := range row.Sensors {
result = append(
result,
ResultRow{
StreamId: row.StreamId,
DateTime: row.DateTime,
RawDataSensorsItems: rowS,
})
}
}
content, err := json.Marshal(result)
PanicIfErr(err)
err = ioutil.WriteFile("./data/output.json", content, 0644)
PanicIfErr(err)
}
func PanicIfErr(err error) {
if err != nil {
panic(err)
}
}
type ResultPacket []ResultRow
type ResultRow struct {
StreamId int `json:"stream_id"`
DateTime string `json:"date_time"`
RawDataSensorsItems
}
type RawDataSensorsItems struct {
AKey string `json:"a_key"`
BKey int `json:"b_key"`
SensorA *int `json:"sensor_a"`
SensorB *int `json:"sensor_b"`
SensorC *int `json:"sensor_c"`
SensorD *int `json:"sensor_d"`
SensorE *int `json:"sensor_e"`
SensorF *int `json:"sensor_f"`
}
type RawDataRow struct {
StreamId int `json:"stream_id"`
DateTime string `json:"date_time"`
Sensors []RawDataSensorsItems `json:"sensors"`
}
type DataPacket []RawDataRow