/ / Goの内部JSON値を取得する - json、go

Go - jsonの内部JSON値を取得、go

JSONのデコードのための構造体をどのように構造化するのが難しいのかという簡単な質問です。

構造体の内部フィールドを構造体の別のフィールドにコピーするにはどうすればよいですか?

私はJSONを持っている

{
"Trains": [{
"Car": "6",
"Destination": "SilvrSpg",
"DestinationCode": "B08",
"DestinationName": "Silver Spring",
"Group": "1",
"Line": "RD",
"LocationCode": "A13",
"LocationName": "Twinbrook",
"Min": "1"
}]
}

私は構造体を持っています

type Trains struct {
Min      string `json:"Min"`
DestName string `json:"DestinationName"`
DestCode string `json:"DestinationCode"`
LocName  string `json:"LocationName"`
LocCode  string `json:"LocationCode"`
Line     string `json:"Line"`
}

type AllData struct {
Data []Trains `json:"Trains"`
}

どのようにTrains.LocationCodeの値を以下のような構造体に得ることができますか?

type AllData struct {
Id Trains[0].LocCode value
Data []Trains `json:"Trains"`
}

だから私は基本的にJSONをこのようにする必要があります

{
"Id":"A13",
"Data": [{
"Car": "6",
"Destination": "SilvrSpg",
"DestinationCode": "B08",
"DestinationName": "Silver Spring",
"Group": "1",
"Line": "RD",
"LocationCode": "A13",
"LocationName": "Twinbrook",
"Min": "1"
}]
}

どこ Id Trains構造体の内部値です。

これを反映するために構造体をどのように構造化できますか?

回答:

回答№1は0

JSONデコーダにはこの機能はありません。アプリケーションにコード行を記述する必要があります。

package main

import (
"encoding/json"
"fmt"
"log"
)

var s = `
{
"Trains": [{
"Car": "6",
"Destination": "SilvrSpg",
"DestinationCode": "B08",
"DestinationName": "Silver Spring",
"Group": "1",
"Line": "RD",
"LocationCode": "A13",
"LocationName": "Twinbrook",
"Min": "1"
}]
}`

type Train struct {
Min      string `json:"Min"`
DestName string `json:"DestinationName"`
DestCode string `json:"DestinationCode"`
LocName  string `json:"LocationName"`
LocCode  string `json:"LocationCode"`
Line     string `json:"Line"`
}

type Data struct {
// The name "-" tells the JSON decoder to ignore this field.
ID     string `json:"-"`
Trains []Train
}

func main() {
var d Data
if err := json.Unmarshal([]byte(s), &d); err != nil {
log.Fatal(err)
}
if len(d.Trains) < 1 {
log.Fatal("No trains")
}
// Copy value from inner to outer.
d.ID = d.Trains[0].LocCode
fmt.Printf("%+vn", &d)
}