シリアル化:
1)単純なデータ構造:
メインパッケージ (インポート " エンコーディング/ JSON " " FMTを" " 反映" ) 学校の種類の構造体を{ 名前 ストリング `JSON:" 名前" ` ロケーション文字列 `JSON:" 場所" ` } メインFUNC(){ 学校: = 学校{ 名前: " 某某学校" 、 場所:" 市区" 、 } STR、ERR: = json.Marshal(学校) IF!ERR = ゼロ{ fmt.Printf(" JSONシリアライズ障害Vの%" 、ERR) } fmt.Println(STR) // 戻り結果[1,233,411,097,109,101 230 159 144 58 34 34 230 159 144 229 173 166 230 161 160 34 44 34 97 1 16 108 111 99 105 111 58 34 34である110 229 229 140 186 184 130 34 125]であるであるである fmt.Println(reflect.TypeOf(STR)) / / 結果を返す[] UINT8 fmt.Println(文字列(STR)) // 結果を返す{ "名前": "特定の学校"、 "場所"、 "都市"} }
最終的な結果をプリントアウトするために、最後のデモ変換によって文字列を行く理由を説明:最終的な結果json.Marshalリターンが相互に変換することができますタイプのバイトスライス、バイト文字列の結果です。
2)入れ子構造。
メインパッケージ のインポート( " 符号化/ JSON " " FMT " ) を入力教室構造体{ 数JSON `INT64:" 番号" ` :床INT32 `JSON " フロア" ` } 学校型構造体{ 名前 ストリング `JSON:" 名前" ` 場所文字列 `JSON:" 場所" ` 教室教室`JSON:"教室"` } FUNCメイン(){ 学校: = 学校{ 名: " 特定の学校" 、 所在地: " 都市" 、 教室:教室{ ナンバー:201 、 フロア: 2 、 }、 } STR、ERR: = json.Marshal (学校) IF ERR!= nilの{ fmt.Printf(" JSONシリアライズ障害のV%" 、ERR) } fmt.Println(文字列(STR)) //戻り結果{ "名前": "特定の学校"、 "場所"、 "都市"、 "教室":{ "番号":201、 "床":2}} }
入れ子構造の学校の教室では、直接シーケンスの割り当て後に初期化することができます。
3)構造体の定義はの練習ではありません。
メインパッケージ のインポート( " 符号化/ JSON " " FMT " ) のmain(){FUNC 学校: = [マップ文字列 ] インターフェイス{} { " 名前":" 某某学校" 、 " 場所":" 市区" 、 「教室"マップ[ ストリング ] インターフェイス{} { " 番号":201 、 "フロア":2 、 }、 } STR、ERR: = json.Marshal(学校) IF!ERR = ゼロ{ fmt.Printf(" JSONシリアライズ障害V%」、ERR) } fmt.Println(文字列(STR)) // 戻り結果{ "名前": "特定の学校"、 "場所"、 "都市"、 "教室":{ "番号":201、 "床":2}} }
初期化後、直接シリアライズ割り当てることができます。
デシリアライズ
1)シンプルな構造:
メインパッケージ のインポート( " 符号化/ JSON " " FMT " ) を入力教室構造体{ 数JSON `INT64:" 番号" ` :床INT32 `JSON " フロア" ` } 学校型構造体{ 名前 ストリング `JSON:" 名前" ` 場所文字列 `JSON:" 場所" ` 教室教室`JSON:"教室"` } メインFUNC(){ STR: = '{ " 名前":" 某某学校"、" 場所":" 市区"、" 教室":{ " 番号":201、" 床":2 }}` VaRの学校学校 json.Unmarshal([] バイト(STR)、および学校) // FUNC非整列化(データ[]バイト、Vインタフェース{})エラー{ FMT。 println(学校) //{戻り生じる特定の都市学校2}} 201 { fmt.Printf( `名:%のS、LOCATION:%のS、教室:%のV、数:Dの%、床:%のD '、 school.name、学校。 LOCATION、school.Classroom、school.Classroom.Number、school.Classroom.Floor) // 名前:XX学校、場所:都市、教室:2 {201}、番号:201、フロア:2 }
非整列化パスは、タイプが直接STR、STR、およびタイプバイトを通過できない最後のスライスの最初のバイトの必要な値を渡すお互いに変換することができます。時間の前のシーケンスの結果の例としては、バイト型のリターンである、それはの私たち自身のSTRに変換されます。
パラメータは、直接透過率値、コピーの配列が最終結果でない場合、過去に第2の構造のポインタを渡す必要があります。
2)直接、デシリアライゼーション
メインパッケージ のインポート( " 符号化/ JSON " " FMT " " を反映" ) 、メイン(){FUNC STRを: = '{ " 名前":" 某某学校"、" 場所":" 市区"、" 教室":{ " 数":201、" 床":2 }} ` のvar学校インターフェース {} json.Unmarshal([]バイト(STR)、および学校) // FUNC非整列化(データ[]バイト、インタフェース{V}){エラー fmt.Println(学校) // 戻り結果マップ[教室:地図[床: 2数:201]位置:都市名:特定の学校] // fmt.Println(school.name) // (IS NO方法を有するタイプのインターフェース{}インターフェイスの)コンパイラエラー未定義school.name // fmt.Println(学校[ "名前"]) // コンパイルエラー操作は無効:スクール[ "名前"]({}タイプのインタフェースがサポートしないインデックス) ヴァル、OK:。=学校(マップ[ 文字列 ] インターフェース{}) IF!OK { FMT。 println("OKタイプではない" ) のリターン } fmt.Println(ヴァル[ " 名前は" ]) // 結果、特定の学校返す [fmt.Println(ヴァル" 教室を")] //は、結果マップ[:2数:201床を返します ] // fmt.Println(ヴァル[ "教室"] [ "数"]) // コンパイルエラー操作は無効:ヴァル[ "教室"] [ "数"]({}タイプのインタフェースがサポートしないインデックス) 教室、OK:ヴァル= [ " 教室" ]。(地図[ 文字列 ] インターフェイス{}) IF!OK { FMT。println( "OKタイプではない" ) のリターン } fmt.Println(教室[ " 番号" ]) // 戻り値の結果201 fmt.Println(reflect.TypeOf(教室[ " ナンバー" ])) // 結果のfloat64を返します }
あなたは、データ構造を定義したくない場合は、あなたが直接、デシリアライズ空のインタフェースを定義することができますが、シリアライズ値の後に、コンパイル時にエラーになりますマップタイプについての最初のアサーションそう。