github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/encoding/json/encode.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  // jsonパッケージは、RFC 7159で定義されているJSONのエンコーディングとデコーディングを実装します。
     6  // JSONとGoの値の間のマッピングは、Marshal関数とUnmarshal関数のドキュメンテーションで説明されています。
     7  //
     8  // このパッケージの紹介については、「JSONとGo」を参照してください:
     9  // https://golang.org/doc/articles/json_and_go.html
    10  package json
    11  
    12  import (
    13  	"github.com/shogo82148/std/reflect"
    14  )
    15  
    16  // Marshalは、vのJSONエンコーディングを返します。
    17  //
    18  // Marshalは、値vを再帰的に走査します。
    19  // もし遭遇した値が [Marshaler] を実装しており、
    20  // それがnilポインタでない場合、Marshalは [Marshaler.MarshalJSON] を呼び出して
    21  // JSONを生成します。[Marshaler.MarshalJSON] メソッドが存在しないが、
    22  // その値が代わりに [encoding.TextMarshaler] を実装している場合、Marshalは
    23  // [encoding.TextMarshaler.MarshalText] を呼び出し、その結果をJSON文字列としてエンコードします。
    24  // nilポインタの例外は厳密には必要ではありませんが、
    25  // [Unmarshaler.UnmarshalJSON] の振る舞いにおける同様の、必要な例外を模倣します。
    26  //
    27  // それ以外の場合、Marshalは以下の型依存のデフォルトエンコーディングを使用します:
    28  //
    29  // ブール値はJSONのブール値としてエンコードされます。
    30  //
    31  // 浮動小数点数、整数、および [Number] の値はJSONの数値としてエンコードされます。
    32  // NaNおよび+/-Infの値は [UnsupportedValueError] を返します。
    33  //
    34  // 文字列の値は、無効なバイトをUnicodeの置換文字に置き換えて、
    35  // 有効なUTF-8に強制されたJSON文字列としてエンコードされます。
    36  // JSONがHTMLの<script>タグ内に埋め込んでも安全であるように、
    37  // 文字列は [HTMLEscape] を使用してエンコードされ、
    38  // "<", ">", "&", U+2028, および U+2029 が "\u003c","\u003e", "\u0026", "\u2028", および "\u2029" にエスケープされます。
    39  // この置換は、[Encoder] を使用している場合、[Encoder.SetEscapeHTML](false)を呼び出すことで無効にできます。
    40  //
    41  // 配列とスライスの値はJSON配列としてエンコードされますが、
    42  // []byteはbase64エンコードされた文字列としてエンコードされ、
    43  // nilスライスはnullのJSON値としてエンコードされます。
    44  //
    45  // 構造体の値はJSONオブジェクトとしてエンコードされます。
    46  // エクスポートされた各構造体フィールドは、オブジェクトのメンバーとなり、
    47  // フィールド名がオブジェクトキーとして使用されます。ただし、以下に示す理由のいずれかでフィールドが省略される場合があります。
    48  //
    49  // 各構造体フィールドのエンコーディングは、構造体フィールドのタグの"json"キーの下に格納された
    50  // フォーマット文字列によってカスタマイズできます。
    51  // フォーマット文字列はフィールド名を指定し、それに続いてカンマで区切られたオプションのリストが続く可能性があります。
    52  // デフォルトのフィールド名を上書きせずにオプションを指定するために、名前は空にすることができます。
    53  //
    54  // "omitempty"オプションは、フィールドが空の値を持つ場合、
    55  // エンコーディングからそのフィールドを省略することを指定します。
    56  // 空の値とは、false、0、nilポインタ、nilインターフェース値、
    57  // そして任意の空の配列、スライス、マップ、または文字列を指します。
    58  //
    59  // 特別なケースとして、フィールドタグが"-"の場合、フィールドは常に省略されます。
    60  // フィールド名が"-"のフィールドでも、タグ"-,"を使用して生成することができることに注意してください。
    61  //
    62  // 構造体フィールドタグの例とその意味:
    63  //
    64  //	// フィールドはJSONでキー"myName"として現れます。
    65  //	Field int `json:"myName"`
    66  //
    67  //	// フィールドはJSONでキー"myName"として現れ、
    68  //	// フィールドの値が空の場合、オブジェクトから省略されます。
    69  //	// 上記で定義されているように。
    70  //	Field int `json:"myName,omitempty"`
    71  //
    72  //	// フィールドはJSONでキー"Field"(デフォルト)として現れますが、
    73  //	// フィールドが空の場合はスキップされます。
    74  //	// 先頭のカンマに注意してください。
    75  //	Field int `json:",omitempty"`
    76  //
    77  //	// フィールドはこのパッケージによって無視されます。
    78  //	Field int `json:"-"`
    79  //
    80  //	// フィールドはJSONでキー"-"として現れます。
    81  //	Field int `json:"-,"`
    82  //
    83  // "string"オプションは、フィールドがJSONエンコードされた文字列内にJSONとして格納されることを示します。
    84  // これは、文字列、浮動小数点数、整数、またはブール型のフィールドにのみ適用されます。
    85  // この追加のエンコーディングレベルは、JavaScriptプログラムと通信する際に時々使用されます:
    86  //
    87  //	Int64String int64 `json:",string"`
    88  //
    89  // キー名は、Unicodeの文字、数字、および引用符、バックスラッシュ、カンマを除くASCIIの句読点のみで構成される
    90  // 空でない文字列の場合に使用されます。
    91  //
    92  // 埋め込まれた構造体のフィールドは、通常、その内部のエクスポートされたフィールドが
    93  // 外部の構造体のフィールドであるかのようにマーシャルされます。これは、次の段落で説明されるように
    94  // 通常のGoの可視性ルールを修正したものに従います。
    95  // JSONタグで名前が指定された匿名の構造体フィールドは、匿名ではなく、その名前を持つものとして扱われます。
    96  // インターフェース型の匿名の構造体フィールドは、匿名ではなく、その型の名前を持つものとして同様に扱われます。
    97  //
    98  // 構造体フィールドのマーシャルまたはアンマーシャルを決定する際に、
    99  // JSONに対してGoの可視性ルールが修正されます。
   100  // 同じレベルに複数のフィールドが存在し、そのレベルが最もネストが少ない
   101  // (したがって、通常のGoのルールによって選択されるネストレベル)場合、
   102  // 次の追加のルールが適用されます:
   103  //
   104  // 1) それらのフィールドの中で、JSONタグが付けられているものがある場合、
   105  // それ以外に競合する未タグのフィールドが複数あっても、タグ付きのフィールドのみが考慮されます。
   106  //
   107  // 2) フィールドが1つだけ(最初のルールに従ってタグ付けされているかどうか)存在する場合、それが選択されます。
   108  //
   109  // 3) それ以外の場合、複数のフィールドが存在し、すべてが無視されます。エラーは発生しません。
   110  //
   111  // 匿名の構造体フィールドの扱いはGo 1.1で新しくなりました。
   112  // Go 1.1より前では、匿名の構造体フィールドは無視されていました。現在のバージョンと以前のバージョンの両方で
   113  // 匿名の構造体フィールドを強制的に無視するには、フィールドにJSONタグ "-" を付けてください。
   114  //
   115  // マップの値はJSONオブジェクトとしてエンコードされます。マップのキーの型は、
   116  // 文字列、整数型、または [encoding.TextMarshaler] を実装する必要があります。マップのキーは
   117  // ソートされ、上記の文字列値に対するUTF-8の強制に従って、以下のルールを適用して
   118  // JSONオブジェクトのキーとして使用されます:
   119  //   - 任意の文字列型のキーは直接使用されます
   120  //   - [encoding.TextMarshalers] はマーシャルされます
   121  //   - 整数キーは文字列に変換されます
   122  //
   123  // ポインタ値は指している値としてエンコードされます。
   124  // nilポインタはnullのJSON値としてエンコードされます。
   125  //
   126  // インターフェースの値は、インターフェースに含まれる値としてエンコードされます。
   127  // nilのインターフェース値は、nullのJSON値としてエンコードされます。
   128  //
   129  // チャネル、複素数、および関数の値はJSONでエンコードすることはできません。
   130  // そのような値をエンコードしようとすると、Marshalは
   131  // [UnsupportedTypeError] を返します。
   132  //
   133  // JSONは循環データ構造を表現することはできませんし、Marshalはそれらを処理しません。
   134  // 循環構造をMarshalに渡すとエラーが発生します。
   135  func Marshal(v any) ([]byte, error)
   136  
   137  // MarshalIndentは [Marshal] と同様ですが、出力のフォーマットに [Indent] を適用します。
   138  // 出力の各JSON要素は、インデントのネストに従ってprefixで始まり、
   139  // その後にindentの1つ以上のコピーが続く新しい行で始まります。
   140  func MarshalIndent(v any, prefix, indent string) ([]byte, error)
   141  
   142  // Marshalerは、自身を有効なJSONにマーシャルできる型が実装するインターフェースです。
   143  type Marshaler interface {
   144  	MarshalJSON() ([]byte, error)
   145  }
   146  
   147  // UnsupportedTypeErrorは、サポートされていない値の型をエンコードしようとしたときに
   148  // [Marshal] によって返されます。
   149  type UnsupportedTypeError struct {
   150  	Type reflect.Type
   151  }
   152  
   153  func (e *UnsupportedTypeError) Error() string
   154  
   155  // UnsupportedValueErrorは、サポートされていない値をエンコードしようとしたときに
   156  // [Marshal] によって返されます。
   157  type UnsupportedValueError struct {
   158  	Value reflect.Value
   159  	Str   string
   160  }
   161  
   162  func (e *UnsupportedValueError) Error() string
   163  
   164  // Go 1.2より前では、InvalidUTF8Errorは、無効なUTF-8シーケンスを含む文字列値をエンコードしようとしたときに
   165  // [Marshal] によって返されました。Go 1.2以降では、[Marshal] は代わりに無効なバイトをUnicodeの置換ルーンU+FFFDで
   166  // 置き換えることにより、文字列を有効なUTF-8に強制します。
   167  //
   168  // Deprecated: もう使用されていません。互換性のために保持されています。
   169  type InvalidUTF8Error struct {
   170  	S string
   171  }
   172  
   173  func (e *InvalidUTF8Error) Error() string
   174  
   175  // MarshalerErrorは、[Marshaler.MarshalJSON] または [encoding.TextMarshaler.MarshalText] メソッドを呼び出す際のエラーを表します。
   176  type MarshalerError struct {
   177  	Type       reflect.Type
   178  	Err        error
   179  	sourceFunc string
   180  }
   181  
   182  func (e *MarshalerError) Error() string
   183  
   184  // Unwrapは基礎となるエラーを返します。
   185  func (e *MarshalerError) Unwrap() error