TOP ▲ itcore TOPTIPSgo_json.php  タグ:go json

GO言語におけるjsonの扱い方法と文字列の記述方法 | itcore 2021年

■GOにおけるjsonの操作
GOではbyteの配列でjsonデータを持つ。
文字列や構造体やmapに変換して操作する。

■文字列の宣言1
var name1 string // 宣言は関数の外でも書ける。
name1 = "yamada"

■文字列の宣言2 関数内で使える。初期値から型の情報を得る。
name1 := "yamada"

■json文字列の作成
import "fmt"
json_str := `{"id":1,"name":"` + name1 + `","data":{"a":"x","b":"y"}}`
fmt.Println(json_str)
※jsonという変数名はパッケージ名とぶつかるために使わないこと。
※`はシングルクォートでなくバッククォートなので注意。

■strconv関数を使った例
json_str2 := "{" + strconv.Quote("id") + ":1,"
json_str2 += strconv.Quote("name") + ":" + strconv.Quote(name1)
json_str2 += "," + strconv.Quote("data") + ":{"
json_str2 += strconv.Quote("a") + ":" + strconv.Quote("x")
json_str2 += "," + strconv.Quote("b") + ":" + strconv.Quote("y")
json_str2 += "}}"
fmt.Println("json_str2=", json_str2)
※少しコードが長くなるがバッククォートを使うよりわかりやすいかも

■文字列の記述方法
1 ブルクォート"で囲む方法 改行を含めることはできず、バックスラッシュ\によるエスケープは解釈される。
2 バッククォートで囲む方法 バッククォート以外の改行を含めたすべての文字を書くことができる。バックスラッシュのエスケープは解釈されない

■jsonバイトへの変換
json_byte := []byte(json_str)
fmt.Println(string(json_byte))

■mapへの変換
import (
  "encoding/json"
  "fmt"
)
  var result map[string]interface{} // 値の型は決められないためinterfaceとする。
  json.Unmarshal(json_byte, &result) // mapへの変換
  id := result["id"]
  name := result["name"]
  data := result["data"].(map[string]interface{}) // 2重map
  fmt.Println("id=", id, " name=", name)
  for key, value := range data {
    fmt.Printf("key=%s value=%s\n", key, value)
  }

■構造体からの変換
  // 構造体
  type Data struct {
    A string `json:"a"`
    B string `json:"b"`
  }
  type Sample struct {
    Id   int    `json:"id"` // 構造体のメンバ変数は先頭大文字にしないとうまく変換されないので注意。idではなくIdとする。
    Name string `json:"name"`
    Data Data   `json:"data"` // jsonの変数名の先頭を小文字にするため別structとする。
  }
  var sample Sample
  sample.Id = 2
  sample.Name = "Yamada"
  sample.Data.A = "X"
  sample.Data.B = "Y"
  json_byte, _ = json.Marshal(sample)
  fmt.Printf("json_str=%s\n", string(json_byte)) // 構造体からjsonバイトへ変換
  var sample2 Sample
  _ = json.Unmarshal(json_byte, &sample2) // jsonバイトから構造体へ変換
  fmt.Printf("sample2=%+v\n", sample2)

■jsonデータのキーの入れ替え
  json.Unmarshal([]byte(json_byte), &result)
  data = result["data"].(map[string]interface{}) // 2重map
  data["c"] = data["a"]
  delete(data, "a")
  json_byte, _ = json.Marshal(result)
  fmt.Printf("json_byte=%s\n", string(json_byte))

■出力結果
{"id":1,"name":"yamada1","data":{"a":"x","b":"y"}}
json_str2= {"id":1,"name":"yamada1","data":{"a":"x","b":"y"}}
{"id":1,"name":"yamada1","data":{"a":"x","b":"y"}}
id= 1  name= yamada1
key=a value=x
key=b value=y
json_str={"id":2,"name":"Yamada","data":{"a":"X","b":"Y"}}
sample2={Id:2 Name:Yamada Data:{A:X B:Y}}
json_byte={"data":{"b":"Y","c":"X"},"id":2,"name":"Yamada"}