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はパケットを解くときにカスタムメソッドを呼び出し、オブジェクトに対して他の処理を行わない.