天天看點

Go語言JSON轉換多重結構體

代碼如下供參考:

package main

import (
	"encoding/json"
	"fmt"
)

// 最内層
type lotsStatus struct { //車位資訊
	ParkingSpaceno     string  `json:"parkingspaceno"`     //車位編号
	SpaceType          int     `json:"spacetype"`          //車位類型  1:普通車位
	ParkingSpaceStatus string  `json:"parkingspacestatus"` //車位狀态 Y:占用(有車) N:未占用(無車)
	PlateNo            string  `json:"plateno"`            //占用車牌号
	Timestamp          float64 `json:"timestamp"`          //上傳時間戳
}

// 包一層
type dataOne struct {
	DataOne []lotsStatus `json:"data"`
}

// 再包一層
type dataTwo struct {
	DataTwo dataOne `json:"data"`
}

// 主結構體,也就是最外面的一層
type LotsStatusAll struct {
	ReturnCode int     `json:"returncode"` //傳回值
	Command    string  `json:"command"`    //指令
	Errordesc  string  `json:"errordesc"`  //是否成功
	Result     dataTwo `json:"result"`     //傳回值
}

func main() {
	var lotsStatus LotsStatusAll

	var strLotStatus = `{
	    "returncode": 0,
	    "command": "get all park state info",
	    "errordesc": "成功",
	    "result": {
	        "data": {
	            "data": [
	                {
	                    "parkingspaceno": "B34",
	                    "spacetype": 2,
	                    "parkingspacestatus": "1",
	                    "plateno": "",
	                    "timestamp": 1617296293.54021
	                },
	                {
	                    "parkingspaceno": "13Q-6",
	                    "spacetype": 2,
	                    "parkingspacestatus": "-1",
	                    "plateno": "",
	                    "timestamp": 1617296293.54021
	                }
	            ]
	        }
	    }
	}`
	err := json.Unmarshal([]byte(strLotStatus), &lotsStatus)
	if err != nil {
		fmt.Println("error:", err)
	} else {
		for _, v := range lotsStatus.Result.DataTwo.DataOne {
			fmt.Printf("ParkingSpaceStatus:%s  ParkingSpaceno:%s\n", v.ParkingSpaceStatus, v.ParkingSpaceno)

		}
	}

}
           

輸出結果:

go run main.go

ParkingSpaceStatus:1  ParkingSpaceno:B34

ParkingSpaceStatus:-1  ParkingSpaceno:13Q-6