github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/encoding/json/decode.go (about) 1 // Copyright 2010 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Represents JSON data structure using native Go types: booleans, floats, 6 // strings, arrays, and maps. 7 8 package json 9 10 import ( 11 "github.com/shogo82148/std/reflect" 12 ) 13 14 // Unmarshalは、JSONエンコードされたデータを解析し、結果をvが指す値に格納します。 15 // もしvがnilまたはポインタでない場合、Unmarshalは [InvalidUnmarshalError] を返します。 16 // 17 // Unmarshalは、[Marshal] が使用するエンコーディングの逆を使用し、 18 // 必要に応じてマップ、スライス、ポインタを割り当てます。 19 // 以下の追加ルールも適用されます: 20 // 21 // JSONをポインタにアンマーシャルするために、Unmarshalはまず 22 // JSONがJSONリテラルnullであるケースを処理します。その場合、Unmarshalは 23 // ポインタをnilに設定します。それ以外の場合、UnmarshalはJSONを 24 // ポインタが指す値にアンマーシャルします。もしポインタがnilなら、Unmarshalは 25 // それが指す新しい値を割り当てます。 26 // 27 // [Unmarshaler] インターフェースを実装する値にJSONをアンマーシャルするために、 28 // Unmarshalはその値の [Unmarshaler.UnmarshalJSON] メソッドを呼び出します、 29 // 入力がJSON nullである場合も含みます。 30 // それ以外の場合、もし値が [encoding.TextUnmarshaler] を実装していて、 31 // 入力がJSONの引用符で囲まれた文字列である場合、Unmarshalはその値の 32 // [encoding.TextUnmarshaler.UnmarshalText] を引用符で囲まれていない形式の文字列で呼び出します。 33 // 34 // JSONを構造体にアンマーシャルするために、Unmarshalは受信したオブジェクトの 35 // キーをMarshalが使用するキー(構造体のフィールド名またはそのタグ)と一致させます。 36 // これは完全一致を優先しますが、大文字小文字を区別しない一致も受け入れます。 37 // デフォルトでは、対応する構造体のフィールドがないオブジェクトのキーは無視されます 38 // (代替として [Decoder.DisallowUnknownFields] を参照してください)。 39 // 40 // インターフェース値にJSONをアンマーシャルするために、 41 // Unmarshalは以下のいずれかをインターフェース値に格納します: 42 // 43 // - bool, for JSON booleans 44 // - float64, for JSON numbers 45 // - string, for JSON strings 46 // - []interface{}, for JSON arrays 47 // - map[string]interface{}, for JSON objects 48 // - nil for JSON null 49 // 50 // JSON配列をスライスにアンマーシャルするために、Unmarshalはスライスの長さを 51 // ゼロにリセットし、各要素をスライスに追加します。 52 // 特別なケースとして、空のJSON配列をスライスにアンマーシャルするために、 53 // Unmarshalはスライスを新しい空のスライスで置き換えます。 54 // 55 // Goの配列にJSON配列をアンマーシャルするために、Unmarshalは 56 // JSON配列の要素を対応するGoの配列の要素にデコードします。 57 // もしGoの配列がJSON配列より小さい場合、 58 // 追加のJSON配列の要素は破棄されます。 59 // もしJSON配列がGoの配列より小さい場合、 60 // 追加のGoの配列の要素はゼロ値に設定されます。 61 // 62 // JSONオブジェクトをマップにアンマーシャルするために、Unmarshalは最初に使用するマップを確立します。 63 // マップがnilの場合、Unmarshalは新しいマップを割り当てます。それ以外の場合、Unmarshalは 64 // 既存のマップを再利用し、既存のエントリを保持します。次に、UnmarshalはJSONオブジェクトから 65 // キーと値のペアをマップに格納します。マップのキーの型は、任意の文字列型、整数、 66 // [json.Unmarshaler] を実装するもの、または [encoding.TextUnmarshaler] を実装するものでなければなりません。 67 // 68 // もしJSONエンコードされたデータに構文エラーが含まれている場合、Unmarshalは [SyntaxError] を返します。 69 // 70 // もしJSON値が特定のターゲット型に適していない場合、 71 // またはJSON数値がターゲット型をオーバーフローする場合、Unmarshalは 72 // そのフィールドをスキップし、可能な限りアンマーシャルを完了します。 73 // もしもっと深刻なエラーが発生しなければ、Unmarshalは最初のそのようなエラーを 74 // 説明する [UnmarshalTypeError] を返します。いずれにせよ、問題のあるフィールドに続く 75 // すべてのフィールドがターゲットオブジェクトにアンマーシャルされることは保証されません。 76 // 77 // JSONのnull値は、そのGoの値をnilに設定することでインターフェース、マップ、ポインタ、スライスにアンマーシャルされます。 78 // nullはJSONで「存在しない」を意味することが多いため、JSONのnullを他のGoの型にアンマーシャルすると、 79 // 値には影響せず、エラーも発生しません。 80 // 81 // 引用符で囲まれた文字列をアンマーシャルするとき、無効なUTF-8または 82 // 無効なUTF-16サロゲートペアはエラーとして扱われません。 83 // 代わりに、それらはUnicodeの置換文字U+FFFDに置き換えられます。 84 func Unmarshal(data []byte, v any) error 85 86 // Unmarshalerは、自分自身のJSON記述をアンマーシャルできる型によって実装されるインターフェースです。 87 // 入力は、JSON値の有効なエンコーディングであると想定できます。 88 // UnmarshalJSONは、戻り値後にデータを保持したい場合、JSONデータをコピーする必要があります。 89 // 90 // 慣習的に、[Unmarshal] 自体の振る舞いを近似するために、 91 // UnmarshalersはUnmarshalJSON([]byte("null"))を何もしない操作として実装します。 92 type Unmarshaler interface { 93 UnmarshalJSON([]byte) error 94 } 95 96 // UnmarshalTypeErrorは、特定のGo型の値に対して適切でないJSON値を説明します。 97 type UnmarshalTypeError struct { 98 Value string 99 Type reflect.Type 100 Offset int64 101 Struct string 102 Field string 103 } 104 105 func (e *UnmarshalTypeError) Error() string 106 107 // UnmarshalFieldErrorは、JSONオブジェクトキーが 108 // エクスポートされていない(したがって書き込み不可能な)構造体フィールドにつながることを説明します。 109 // 110 // Deprecated: もはや使用されていません。互換性のために保持されています。 111 type UnmarshalFieldError struct { 112 Key string 113 Type reflect.Type 114 Field reflect.StructField 115 } 116 117 func (e *UnmarshalFieldError) Error() string 118 119 // InvalidUnmarshalErrorは、[Unmarshal] に渡された無効な引数を説明します。 120 // ([Unmarshal] への引数はnilでないポインタでなければなりません。) 121 type InvalidUnmarshalError struct { 122 Type reflect.Type 123 } 124 125 func (e *InvalidUnmarshalError) Error() string 126 127 // Numberは、JSONの数値リテラルを表します。 128 type Number string 129 130 // Stringは、数値のリテラルテキストを返します。 131 func (n Number) String() string 132 133 // Float64は、数値をfloat64として返します。 134 func (n Number) Float64() (float64, error) 135 136 // Int64は、数値をint64として返します。 137 func (n Number) Int64() (int64, error)