golang json
4990 ワード
jsonのstruct,array,map,str変換
構造体、map、スライスからjson:シーケンス化jsonから構造体、map、スライス:逆シーケンス化
package main
import (
"encoding/json"
"fmt"
"os"
)
type ConfigStruct struct {
Host string `json:"host"`
Port int `json:"port"`
AnalyticsFile string `json:"analytics_file"`
StaticFileVersion int `json:"static_file_version"`
StaticDir string `json:"static_dir"`
TemplatesDir string `json:"templates_dir"`
SerTcpSocketHost string `json:"serTcpSocketHost"`
SerTcpSocketPort int `json:"serTcpSocketPort"`
Fruits []string `json:"fruits"`
}
type Other struct {
SerTcpSocketHost string `json:"serTcpSocketHost"`
SerTcpSocketPort int `json:"serTcpSocketPort"`
Fruits []string `json:"fruits"`
}
func main() {
jsonStr := `{"host": "http://localhost:9090","port": 9090,"analytics_file": "","static_file_version": 1,"static_dir": "E:/Project/goTest/src/","templates_dir": "E:/Project/goTest/src/templates/","serTcpSocketHost": ":12340","serTcpSocketPort": 12340,"fruits": ["apple", "peach"]}`
//json str map
var dat map[string]interface{}
if err := json.Unmarshal([]byte(jsonStr), &dat); err == nil {
fmt.Println("==============json str map=======================")
fmt.Println(dat)
fmt.Println(dat["host"])
}
//json str struct
var config ConfigStruct
if err := json.Unmarshal([]byte(jsonStr), &config); err == nil {
fmt.Println("================json str struct==")
fmt.Println(config)
fmt.Println(config.Host)
}
//json str struct( )
var part Other
if err := json.Unmarshal([]byte(jsonStr), &part); err == nil {
fmt.Println("================json str struct==")
fmt.Println(part)
fmt.Println(part.SerTcpSocketPort)
}
//struct json str
if b, err := json.Marshal(config); err == nil {
fmt.Println("================struct json str==")
fmt.Println(string(b))
}
//map json str
fmt.Println("================map json str=====================")
enc := json.NewEncoder(os.Stdout)
enc.Encode(dat)
//array json str
arr := []string{"hello", "apple", "python", "golang", "base", "peach", "pear"}
lang, err := json.Marshal(arr)
if err == nil {
fmt.Println("================array json str==")
fmt.Println(string(lang))
}
//json []string
var wo []string
if err := json.Unmarshal(lang, &wo); err == nil {
fmt.Println("================json []string==")
fmt.Println(wo)
}
}
StructTag
構造体のメンバーとJSONフィールドの対応関係を手動で構成する場合は、構造体を定義するときにメンバーにラベルを付けることができます:omitemptyを使用して熟知しています.このフィールドがnilまたは0値(数字0、文字列「」、空の配列[]など)の場合、パッケージされたJSON結果にはこのフィールドはありません.
type Message struct {
Name string `json:"msg_name"` // JSON msg_name
Body string `json:"body,omitempty"` //
Time int64 `json:"-"` //
}
var m = Message{
Name: "Alice",
Body: "",
Time: 1294706395881547000,
}
data, err := json.Marshal(m)
if err != nil {
fmt.Printf(err.Error())
return
}
fmt.Println(string(data))
Output:
{"msg_name":"Alice"}
jsonを使用します。RawMessage
json.RawMessageは実は[]byteタイプの再定義です.強制タイプ変換が可能です.jsonを使用します.RawMessageの場合,ArgsフィールドはUnmarshalでは解析されず,直接バイトデータをArgsに付与する.まず第1層のJSONデータを解包し,Cmdの値に基づいてArgsの具体的なタイプを決定して第2次Unmarshalを行うことができる.ここで注意したいのは、必ずポインタタイプ*jsonを使用することです.RawMessage、そうでなければArgsでは[]byteタイプとみなされ、パッケージング時にbase 64符号化文字列にパッケージングされます.
構造体の1つのフィールドのフォーマットが不明なシーンがあります.
type Command struct {
ID int
Cmd string
Args *json.RawMessage
}
Interface{}の使用
interface{}タイプUnmarshalの場合、JSONは自動的に対応するデータ型に変換されます.
JSONのbooleanからbool JSONへの数値変換float 64 JSONの文字列変換string JSONのArray変換[]interface{}JSONのObject変換map[string]interface{}JSONのnull変換nil
注意が必要なのは2つあります.一つはすべてのJSON数値が自動的にfloat 64タイプに変換され、使用時に必要なint、int 64などのタイプに手動で変換される.2つ目はJSONのobjectがmap[string]interface{}タイプに自動的に変換され、アクセス時にJSON Objectのフィールド名をkeyとして直接アクセスします.JSONデータのフォーマットが分からない場合はinterface{}を使用できます.
カスタムタイプ
オブジェクトのパッケージ解除方法を自分で定義する場合は、次のインタフェースを実行できます.
type Marshaler interface {
MarshalJSON() ([]byte, error)
}
type Unmarshaler interface {
UnmarshalJSON([]byte) error
}
このインタフェースを実装するオブジェクトは、独自のデータをパッケージ化およびパケット解除する必要があります.インタフェースが実装されると、jsonはパケットを解くときにカスタムメソッドを呼び出し、オブジェクトに対して他の処理を行わない.