ホームページ  >  記事  >  バックエンド開発  >  Go で Json を使用する方法を教えます

Go で Json を使用する方法を教えます

藏色散人
藏色散人転載
2021-12-28 15:44:211566ブラウズ

この記事は、Go 言語で Json を使用する方法を紹介する golang チュートリアル コラムによって提供されており、困っている友人の役に立てば幸いです。

エンコード

オブジェクトを JSON データにエンコードし、interface{} オブジェクトを受け入れます、[]byteerror を返します:

func Marshal(v interface{}) ([]byte, error)

Marshal この関数はオブジェクト全体を再帰的に走査し、メンバーの型によってオブジェクトを評価します。エンコーディング、型変換ルールは次のとおりです:

  • bool 型を JSONBoolean## に変換します。

  • #整数、浮動小数点数、その他の数値型は

    JSONNumber

  • に変換されます。 #string JSON の文字列に変換します ("" 引用符付き)

  • struct # の に変換します##JSON Object を作成し、

  • 配列またはスライスを
  • JSON

    Array## に再帰的にパックします。 各メンバーの型に基づきます。

  • #[]byte
  • は、最初に

    base64 エンコードされてから、JSON 文字列に変換されます

  • map
  • Object に変換され、JSON に変換されました。key である必要がありますstring

    ##interface{}
  • 実際の内部型に応じて変換します
  • #nil
  • 変換
  • JSON

    null##channel

  • func
  • 、およびその他の型は

    UnsupportedTypeError を返します。

    type ColorGroup struct { 
     ID  int 
     Name string 
     Colors []string 
    } group := ColorGroup{ 
     ID:  1, 
     Name: "Reds", 
     Colors: []string{"Crimson", "Red", "Ruby", "Maroon"}, } b, err := json.Marshal(group) if err != nil { 
     fmt.Println("error:", err) } os.Stdout.Write(b) Output: {"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}
  • デコード

デコード JSONdata

func Unmarshal(data []byte, v interface{}) error
型変換ルールと上記のルール

var jsonBlob = []byte(`[ 
 {"Name": "Platypus", "Order": "Monotremata"}, 
 {"Name": "Quoll", "Order": "Dasyuromorphia"} 
]`) type Animal struct { 
 Name string 
 Order string 
} var animals []Animal 
err := json.Unmarshal(jsonBlob, &animals) if err != nil { 
 fmt.Println("error:", err) } fmt.Printf("%+v", animals) Output: [{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]

構造体

構造体は、処理するには大文字で始まるメンバーである必要があります。 JSON による、小文字で始まるメンバーは効果がありません。

Mashal、構造体のメンバー変数名は、JSON

Object# の key として ## に直接パッケージ化されます。 JSON;Unmashal、対応する変数名は割り当てのために自動的に照合され、大文字と小文字は区別されません。 Unmarshal の際、JSON に余分なフィールドがある場合、それらは直接破棄されます。

JSON

にフィールドがない場合は、構造内の変数に値を代入しないことは無視され、エラーは報告されません。 <pre class="brush:php;toolbar:false">type Message struct {   Name string   Body string   Time int64   inner string  } var m = Message{   Name: &quot;Alice&quot;,   Body: &quot;Hello&quot;,   Time: 1294706395881547000,   inner: &quot;ok&quot;, } b := []byte(`{&quot;nAmE&quot;:&quot;Bob&quot;,&quot;Food&quot;:&quot;Pickle&quot;, &quot;inner&quot;:&quot;changed&quot;}`) err := json.Unmarshal(b, &amp;m) if err != nil {   fmt.Printf(err.Error())   return} fmt.Printf(&quot;%v&quot;, m) Output: {Bob Hello 1294706395881547000 ok}</pre>StructTag

構造体のメンバーと JSON の間の対応関係を手動で構成する場合構造体にラベルを付けるときは、メンバーにラベルを付けます。 フィールドが

nil

または 0 値 (数値 0) の場合は、使い慣れた omitempty を使用します。 、文字列 ""、空の配列 [] など)、パッケージ化された

JSON

結果にはこのフィールドはありません。 <pre class="brush:php;toolbar:false">type Message struct {   Name string `json:&quot;msg_name&quot;`  // 对应JSON的msg_name   Body string `json:&quot;body,omitempty&quot;` // 如果为空置则忽略字段   Time int64 `json:&quot;-&quot;`    // 直接忽略字段 } var m = Message{   Name: &quot;Alice&quot;,   Body: &quot;&quot;,   Time: 1294706395881547000, } data, err := json.Marshal(m) if err != nil {   fmt.Printf(err.Error())   return} fmt.Println(string(data)) Output: {&quot;msg_name&quot;:&quot;Alice&quot;}</pre>使用の柔軟性が向上JSON

json.RawMessageを使用

json .RawMessage は、実際には []byte 型の再定義です。キャスト可能です。

構造内のフィールドの 1 つの形式が不明なシナリオがあります: <pre class="brush:php;toolbar:false">type Command struct {   ID int   Cmd string   Args *json.RawMessage  }</pre>json.RawMessage が使用されている場合、

Args

#Unmarshal

の場合、## フィールドは解析されず、バイト データは

Args に直接割り当てられます。まず最初のレイヤーの JSON データを解凍し、次に Cmd の値に基づいて Args の特定のタイプを 2 回目に決定しますアンマーシャルここで、ポインタ型 *json.RawMessage を使用する必要があることに注意してください。そうでない場合、Args[]byte

とみなされます。型は、パッケージ化時に

base64 エンコードされた文字列にパックされます。 インターフェース{}

インターフェース{}type を使用すると、JSON が自動的に対応するデータ型:

JSON的boolean 转换为boolJSON的数值 转换为float64JSON的字符串 转换为stringJSON的Array 转换为[]interface{}JSON的Object 转换为map[string]interface{}JSON的null 转换为nil
注意すべき点が 2 つあります。 1 つは、すべての

JSON 値が float64 型に自動的に変換されることです。使用する場合は、必要な int、## に手動で変換する必要があります。 #int64 およびその他の型。 2 つ目は

JSON

object で、自動的に map[string]interface{} 型に変換されます。アクセスする際は JSON ``Object'' を使用します。 ## 直接 # のフィールド名は key としてアクセスされます。 JSON データの形式がわからない場合は、interface{} を使用できます。

自定义类型

如果希望自己定义对象的打包解包方式,可以实现以下的接口:

type Marshaler interface { 
 MarshalJSON() ([]byte, error) } type Unmarshaler interface { 
 UnmarshalJSON([]byte) error 
}

实现该接口的对象需要将自己的数据打包和解包。如果实现了该接口,json在打包解包时则会调用自定义的方法,不再对该对象进行其他处理。                                                          

以上がGo で Json を使用する方法を教えますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。