GolangでJSONを取り扱う方法について易しく解説します!

Golang

本記事では、プログラミング言語GoでJSONを使用する方法を紹介します。

JSONとは?

JSONは、JavaScript Object Notationの略で、広く使われているデータ交換フォーマットです。

JSONは非常に便利なデータ形式で、現在ではほとんどあらゆるところで使用されています。

JSONとGoでサポートされるデータ型

以下は、GoのデフォルトでJSONでサポートされているデータ型です。エンコードされているデフォルトの型は以下の通りです。

  • booleanデータには boolを使用します。
  • stringは文字列を表します。
  • float64は数値データ。
  • nil はnull値。

構造体をJSONにMarshalする

Marshalする(Marshaling)とは、データを符号化することです。

GolangのJSONパッケージは、データをJSONにエンコードするためのMarshal関数を持っています。

以下は、データをマーシャル化するコード例です。

package main
 
import (
    "fmt"
    "encoding/json"
)
 
type Book struct {
    Name string
    Author string
}
 
func main() {
    book := Book{"C++ programming language", "Bjarne Stroutsrup"}
    res, err := json.Marshal(book)
     
    if err != nil {
        fmt.Println(err)
    }
     
    fmt.Println(string(res))      // {"Name":"C++ programming language","Author":"Bjarne Stroutsrup"}
}

GolangでJSONのUnmarshalを行う

UnmarshalはMarshalの反対であり、デコードのことです。

以下のコードでは、JSONをGolangの構造体に変換しています。

package main
 
import (
    "fmt"
    "encoding/json"
)
 
type Game struct {
    Name string
    Rating float64
}
 
func main() {
    codString := `{"Name": "Call of Duty", "Rating": 8.4}`
     
    var cod Game
     
    err := json.Unmarshal([]byte(codString), &cod)
     
    if err != nil {
        fmt.Println(err)
    }
     
    fmt.Printf("%+v\n", cod)     // {Name:Call of Duty Rating:8.4}  
}

GolangにおけるJSON配列

JSONの配列は、スライス型だけでなく、配列のUnmarshalも可能です。

以下のコード例では、どのように行われるかを見ることができます。

package main
 
import (
    "fmt"
    "encoding/json"
)
 
type Software struct {
    Name string
    Developer string
}
 
func main() {
 
    softwaresJson := `[{"Name": "AutoCAD","Developer": "Autodesk"},{"Name": "Firefox","Developer": "Mozilla"},{"Name": "Chrome","Developer": "Google"}]`
     
    var softwares []Software
     
    err := json.Unmarshal([]byte(softwaresJson), &softwares)
     
    if err != nil {
        fmt.Println(err)
    }
     
    fmt.Printf("%v\n", softwares)        // [{AutoCAD Autodesk} {Firefox Mozilla} {Chrome Google}]
}

GolangでJSONにスライスする

スライスは簡単にJSONに変換することができます。

package main
 
import (
    "fmt"
    "encoding/json"
)
 
type App struct {
    Name string
}
 
func main() {
    apps := []App{
        {Name: "Google Play"},
        {Name: "Evernote"},
        {Name: "Buffer"},
    }
     
    appsJson, err := json.Marshal(apps)
     
    if err != nil {
        fmt.Println(err)
    }
     
    fmt.Println(string(appsJson))     // [{"Name":"Google Play"},{"Name":"Evernote"},{"Name":"Buffer"}]
     
}

JSONでカスタム属性を設定する

Goでデータを扱うとき、JSONのカスタム属性を設定することができます。それは、すでに与えられている名前の代わりに、JSONにエンコードするときに使用されます。

ここでは、カスタム属性の設定方法を説明します。

type Book struct {
    Name string `json:"title"`
    Author Author `json:"author"`
}

Golangで構造化されていないJSONをMapに変換する

構造化されていないJSONデータは、Goでマップにデコードすることができます。この例では、マップを使って構造化されていないJSONデータをデコードする方法を紹介します。

package main
 
import (
    "fmt"
    "encoding/json"
)
 
func main() {
    unstructuredJson := `{"os": {"Windows": "Windows OS","Mac": "OSX","Linux": "Ubuntu"},"compilers": "gcc"}`
     
    var result map[string]interface{}
     
    json.Unmarshal([]byte(unstructuredJson), &result)
     
    fmt.Println(result["os"])    // map[Linux:Ubuntu Mac:OSX Windows:Windows OS]
}

非構造化データのエンコード

非構造化データをJSONにエンコードするには、マップを使用することができます。

ここでは、その方法を紹介する。

package main
 
import (
    "fmt"
    "encoding/json"
)
 
type Address struct {
    Street string
    City string
}
 
type Person struct {
    Name string
    Address Address
}
 
func main() {
    p := Person{
        Name: "Sherlock Holmes",
        Address: Address{
            "22/b Baker street", 
            "London",
        },
    }
     
    str, err := json.Marshal(p)
     
    if err != nil {
        fmt.Println(err)
    }
     
    fmt.Println(string(str))  // {"Name":"Sherlock Holmes","Address":{"Street":"22/b Baker street","City":"London"}}
}

空のフィールドを無視する

「omitempty」というflagを使うとフィールドが空の場合、データの一部をスキップすることができる。

type book struct {
        Name string `json:"Name"`
        Author string `json:"Author, omitempty"`
}

JSONのフィールドをスキップする

JSONのエンコード時にフィールドをスキップするには、属性として”-“を使用するだけです。

type User struct {
    Name string `json:"Name"`
    Password string `json:"-"`
}

まとめ

GolangでJSONを使用するには、柔軟性が多く様々な方法があります。

これらを駆使することで、APIと相互作用するアプリケーションを簡単に書くことができます。

タイトルとURLをコピーしました