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)