simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

goでjson文字列からオブジェクトを生成

■前置き

Goで書いたWebAPIサーバが今 json 文字列を受け取っています。
json文字列に含まれる情報から必要な値をピックアップして、外部のグラフ表示ソフトが期待しているようなフォーマットでファイル出力しなければなりません。

さて、つまり json 文字列から go 環境にて、元のデータ構造を完全復元(または必要なフィールドのみ対応)して、独自フォーマットでファイル出力する必要があります。

汎用的な操作かつ、非常に需要があるケースなので、対応方法がすぐ見つかると思います。

■調査結果

はい、すぐに見つかりました。
JSONのパース/生成 - はじめてのGo言語

ここを参考にします。

■本題
前回の obj から生成した次の json 文字列をパースしてみましょう。
{"obj2":{"a":1,"b":2,"array":[{"test":"hoge","pageX":101,"pageY":102,"identifier":321},{"test":"hoge","pageX":201,"pageY":202,"identifier":987}]},"obj3":{"c":3,"d":4}}

go 側の実装は次の通り、対応するデータタイプに json タグを付けます。
ここで type struct で定義するフィールドは必ず大文字で始まらなければならない規則があることに注意してください。
必ずフィールド名は頭文字を大文字にする必要があることに注意してください。
フィールド名は頭文字を大文字に( ゚д゚)…もういいか

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"os"
	"strconv"
	"time"
)

// Animal a
type Animal struct {
	Test       string `json:"test"`
	PageX      int    `json:"pageX"`
	pageY      int    `json:"pageY"`
	Identifier int    `json:"identifier"`
}

// OBJ2 b
type OBJ2 struct {
	A       int      `json:"a"`
	B       int      `json:"b"`
	Animals []Animal `json:"array"`
}

// OBJ3 c
type OBJ3 struct {
	C int `json:"c"`
	D int `json:"d"`
}

// OBJ a
type OBJ struct {
	Obj2 OBJ2 `json:"obj2"`
	Obj3 OBJ3 `json:"obj3"`
}

// handler impl
	r.ParseForm()
	form := r.PostForm
	output := fmt.Sprintf("%s", form["json"][0])
	
	jsonBytes := ([]byte)(output)
	postData := new(OBJ)
	if err := json.Unmarshal(jsonBytes, postData); err != nil {
		log.Fatal(err)
	}

	// access test
	fmt.Println("data a = " + strconv.Itoa(postData.Obj2.A))
	fmt.Println("data b = " + strconv.Itoa(postData.Obj2.B))
	fmt.Println("data c = " + strconv.Itoa(postData.Obj3.C))
	fmt.Println("data d = " + strconv.Itoa(postData.Obj3.D))
	for i, v := range postData.Obj2.Animals {
		fmt.Print(fmt.Sprintf("index:%d,value: %v\n", i, v))
	}

デバッグコンソールの出力は次の通りでした。

data a = 1
data b = 2
data c = 3
data d = 4
index:0,value: {hoge 101 0 321}
index:1,value: {hoge 201 0 987}

goでjson文字列からオブジェクトを生成できました。
過去の一連の記事を読んだ方なら、今の私と一緒で
WebページにおけるユーザアクティビティをWebAPIサーバに記録できる能力を持ったことになりますw。