Golang Struct 與 JSON 的快速轉換法
Toby
Toby

作為前 PHP 開發者,一說到 Golang 要把東西轉做 JSON 就頭痛,因為在 php 裡面你可以非常簡單的把一個複雜的結構轉換成 json,例如說:

就能夠輸出

所以在開發 php 的時候基本上是不用特別處理 json 的轉換的,到了 javascript 一端也能夠輕易的把收回來的資料直接使用,例如:

$.get("url_here",function(data){
    console.log(data[0]);
});
// 輸出 "Hello"

但是去到 Golang 之後寫法就完全不同了,在這篇簡短的文章中,我會簡單介紹一下怎樣輕易的把任何資料 parse 成 JSON string 及由 JSON string 轉回原本型態的方法

Golang 的 Struct 是一樣很神奇的東西

甚麼是 Golang Struct 呢?這個跟 C 語言裡的沒差太遠,簡單來說就是 Golang 上 OOP 的方法。以下是一個簡單的 Struct 例子(原碼取自 ArOZ Online 1.0)

type desktopObject struct{
	Filepath string;
	Filename string;
	Ext string;
	IsDir bool;
	IsShortcut bool;
	IconX int;
	IconY int;
}

把 Struct 轉換成 JSON

這是一個用來定義桌面上的物品的 struct。要把它轉到 JSON 十分簡單,首先你要新建一個 Object

thisFileObject := new(desktopObject)

然後把資料填進去,例如這樣

thisFileObject.Filepath = path;
thisFileObject.Filename = filepath.Base(path)
thisFileObject.Ext = filepath.Ext(path)
thisFileObject.IsDir = IsDir(path)

最後把它壓成一個 JSON String

jsonString, err:= json.Marshal(desktopFiles); 
if (err != nil){
    //錯誤處理
}
return string(jsonString);

就是這樣你的 JSON String 就做好了

由 JSON 轉回 Struct

這個就難一點了,但是還是能做到的。簡單來說就是把 JSON string map 到一個現有的 struct 上面去。先假設我們有以下的一個 struct

type iconLocation struct{
	X int;
	Y int;
}

和一個 JSON string

jsonstring := "你要轉換的東西"

首先你跟上面做的一樣,先預留一個變數給 json unmarshal 時用。然後把 json string 轉換到這個 struct 裡面。

thisLocation := new(iconLocation)
json.Unmarshal([]byte(jsonstring ), &thisLocation)
fmt.Println(thisLocation)

這樣你就完全把 JSON string 轉回去 struct 了。有夠簡單吧?