Documentation
¶
Overview ¶
jsonパッケージは、RFC 7159で定義されているJSONのエンコーディングとデコーディングを実装します。 JSONとGoの値の間のマッピングは、Marshal関数とUnmarshal関数のドキュメンテーションで説明されています。
このパッケージの紹介については、「JSONとGo」を参照してください: https://golang.org/doc/articles/json_and_go.html
Example (CustomMarshalJSON) ¶
package main import ( "github.com/shogo82148/std/encoding/json" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/log" ) const ( Unknown Animal = iota Gopher Zebra ) func main() { blob := `["gopher","armadillo","zebra","unknown","gopher","bee","gopher","zebra"]` var zoo []Animal if err := json.Unmarshal([]byte(blob), &zoo); err != nil { log.Fatal(err) } census := make(map[Animal]int) for _, animal := range zoo { census[animal] += 1 } fmt.Printf("Zoo Census:\n* Gophers: %d\n* Zebras: %d\n* Unknown: %d\n", census[Gopher], census[Zebra], census[Unknown]) }
Output: Zoo Census: * Gophers: 3 * Zebras: 2 * Unknown: 3
Example (TextMarshalJSON) ¶
package main import ( "github.com/shogo82148/std/encoding/json" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/log" ) const ( Unrecognized Size = iota Small Large ) func main() { blob := `["small","regular","large","unrecognized","small","normal","small","large"]` var inventory []Size if err := json.Unmarshal([]byte(blob), &inventory); err != nil { log.Fatal(err) } counts := make(map[Size]int) for _, size := range inventory { counts[size] += 1 } fmt.Printf("Inventory Counts:\n* Small: %d\n* Large: %d\n* Unrecognized: %d\n", counts[Small], counts[Large], counts[Unrecognized]) }
Output: Inventory Counts: * Small: 3 * Large: 2 * Unrecognized: 3
Index ¶
- func Compact(dst *bytes.Buffer, src []byte) error
- func HTMLEscape(dst *bytes.Buffer, src []byte)
- func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error
- func Marshal(v any) ([]byte, error)
- func MarshalIndent(v any, prefix, indent string) ([]byte, error)
- func Unmarshal(data []byte, v any) error
- func Valid(data []byte) bool
- type Decoder
- type Delim
- type Encoder
- type InvalidUTF8Errordeprecated
- type InvalidUnmarshalError
- type Marshaler
- type MarshalerError
- type Number
- type RawMessage
- type SyntaxError
- type Token
- type UnmarshalFieldErrordeprecated
- type UnmarshalTypeError
- type Unmarshaler
- type UnsupportedTypeError
- type UnsupportedValueError
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func HTMLEscape ¶
HTMLEscapeは、JSONエンコードされたsrcをdstに追加します。ただし、文字列リテラル内の<, >, &, U+2028およびU+2029 文字は\u003c, \u003e, \u0026, \u2028, \u2029に変更されます。 これにより、JSONはHTMLの<script>タグ内に埋め込むのに安全になります。 歴史的な理由から、ウェブブラウザは<script>タグ内で標準的なHTMLエスケープを尊重しないため、 代替のJSONエンコーディングを使用する必要があります。
Example ¶
package main import ( "github.com/shogo82148/std/bytes" "github.com/shogo82148/std/encoding/json" "github.com/shogo82148/std/os" ) func main() { var out bytes.Buffer json.HTMLEscape(&out, []byte(`{"Name":"<b>HTML content</b>"}`)) out.WriteTo(os.Stdout) }
Output: {"Name":"\u003cb\u003eHTML content\u003c/b\u003e"}
func Indent ¶
Indentは、JSONエンコードされたsrcのインデント形式をdstに追加します。 JSONオブジェクトまたは配列の各要素は、新しい、インデントされた行で始まり、 その行はprefixで始まり、インデントのネストに応じてindentの1つ以上のコピーが続きます。 dstに追加されるデータは、prefixやインデントで始まらないようになっています。 これにより、他のフォーマットされたJSONデータ内に埋め込むのが容易になります。 srcの先頭の空白文字(スペース、タブ、キャリッジリターン、改行)は削除されますが、 srcの末尾の空白文字は保持され、dstにコピーされます。 例えば、srcが末尾のスペースを持っていない場合、dstも持ちません。 srcが末尾の改行で終わる場合、dstも同様になります。
Example ¶
package main import ( "github.com/shogo82148/std/bytes" "github.com/shogo82148/std/encoding/json" "github.com/shogo82148/std/log" "github.com/shogo82148/std/os" ) func main() { type Road struct { Name string Number int } roads := []Road{ {"Diamond Fork", 29}, {"Sheep Creek", 51}, } b, err := json.Marshal(roads) if err != nil { log.Fatal(err) } var out bytes.Buffer json.Indent(&out, b, "=", "\t") out.WriteTo(os.Stdout) }
Output: [ = { = "Name": "Diamond Fork", = "Number": 29 = }, = { = "Name": "Sheep Creek", = "Number": 51 = } =]
func Marshal ¶
Marshalは、vのJSONエンコーディングを返します。
Marshalは、値vを再帰的に走査します。 もし遭遇した値がMarshalerインターフェースを実装しており、 それがnilポインタでない場合、MarshalはそのMarshalJSONメソッドを呼び出して JSONを生成します。MarshalJSONメソッドが存在しないが、 その値が代わりにencoding.TextMarshalerを実装している場合、Marshalは そのMarshalTextメソッドを呼び出し、その結果をJSON文字列としてエンコードします。 nilポインタの例外は厳密には必要ではありませんが、 UnmarshalJSONの振る舞いにおける同様の、必要な例外を模倣します。
それ以外の場合、Marshalは以下の型依存のデフォルトエンコーディングを使用します:
ブール値はJSONのブール値としてエンコードされます。
浮動小数点数、整数、およびNumberの値はJSONの数値としてエンコードされます。 NaNおよび+/-Infの値は[UnsupportedValueError]を返します。
文字列の値は、無効なバイトをUnicodeの置換文字に置き換えて、 有効なUTF-8に強制されたJSON文字列としてエンコードされます。 JSONがHTMLの<script>タグ内に埋め込んでも安全であるように、 文字列はHTMLEscapeを使用してエンコードされ、 "<", ">", "&", U+2028, および U+2029 が "\u003c","\u003e", "\u0026", "\u2028", および "\u2029" にエスケープされます。 この置換は、エンコーダを使用している場合、SetEscapeHTML(false)を呼び出すことで無効にできます。
配列とスライスの値はJSON配列としてエンコードされますが、 []byteはbase64エンコードされた文字列としてエンコードされ、 nilスライスはnullのJSON値としてエンコードされます。
構造体の値はJSONオブジェクトとしてエンコードされます。 エクスポートされた各構造体フィールドは、オブジェクトのメンバーとなり、 フィールド名がオブジェクトキーとして使用されます。ただし、以下に示す理由のいずれかでフィールドが省略される場合があります。
各構造体フィールドのエンコーディングは、構造体フィールドのタグの"json"キーの下に格納された フォーマット文字列によってカスタマイズできます。 フォーマット文字列はフィールド名を指定し、それに続いてカンマで区切られたオプションのリストが続く可能性があります。 デフォルトのフィールド名を上書きせずにオプションを指定するために、名前は空にすることができます。
"omitempty"オプションは、フィールドが空の値を持つ場合、 エンコーディングからそのフィールドを省略することを指定します。 空の値とは、false、0、nilポインタ、nilインターフェース値、 そして任意の空の配列、スライス、マップ、または文字列を指します。
特別なケースとして、フィールドタグが"-"の場合、フィールドは常に省略されます。 フィールド名が"-"のフィールドでも、タグ"-,"を使用して生成することができることに注意してください。
構造体フィールドタグの例とその意味:
// フィールドはJSONでキー"myName"として現れます。 Field int `json:"myName"` // フィールドはJSONでキー"myName"として現れ、 // フィールドの値が空の場合、オブジェクトから省略されます。 // 上記で定義されているように。 Field int `json:"myName,omitempty"` // フィールドはJSONでキー"Field"(デフォルト)として現れますが、 // フィールドが空の場合はスキップされます。 // 先頭のカンマに注意してください。 Field int `json:",omitempty"` // フィールドはこのパッケージによって無視されます。 Field int `json:"-"` // フィールドはJSONでキー"-"として現れます。 Field int `json:"-,"`
"string"オプションは、フィールドがJSONエンコードされた文字列内にJSONとして格納されることを示します。 これは、文字列、浮動小数点数、整数、またはブール型のフィールドにのみ適用されます。 この追加のエンコーディングレベルは、JavaScriptプログラムと通信する際に時々使用されます:
Int64String int64 `json:",string"`
キー名は、Unicodeの文字、数字、および引用符、バックスラッシュ、カンマを除くASCIIの句読点のみで構成される 空でない文字列の場合に使用されます。
通常、匿名の構造体フィールドは、その内部のエクスポートされたフィールドが 外部の構造体のフィールドであるかのようにマーシャルされます。 これは、次の段落で説明される通常のGoの可視性ルールを修正したものに従います。 JSONタグで名前が指定された匿名の構造体フィールドは、 匿名ではなく、その名前を持つものとして扱われます。 インターフェース型の匿名の構造体フィールドは、 匿名ではなく、その型の名前を持つものとして同様に扱われます。
構造体フィールドのマーシャルまたはアンマーシャルを決定する際に、 JSONに対してGoの可視性ルールが修正されます。 同じレベルに複数のフィールドが存在し、そのレベルが最もネストが少ない (したがって、通常のGoのルールによって選択されるネストレベル)場合、 次の追加のルールが適用されます:
1) それらのフィールドの中で、JSONタグが付けられているものがある場合、 それ以外に競合する未タグのフィールドが複数あっても、タグ付きのフィールドのみが考慮されます。
2) フィールドが1つだけ(最初のルールに従ってタグ付けされているかどうか)存在する場合、それが選択されます。
3) それ以外の場合、複数のフィールドが存在し、すべてが無視されます。エラーは発生しません。
匿名の構造体フィールドの扱いはGo 1.1で新しくなりました。 Go 1.1より前では、匿名の構造体フィールドは無視されていました。現在のバージョンと以前のバージョンの両方で 匿名の構造体フィールドを強制的に無視するには、フィールドにJSONタグ "-" を付けてください。
マップの値はJSONオブジェクトとしてエンコードされます。マップのキーの型は、 文字列、整数型、またはencoding.TextMarshalerを実装する必要があります。マップのキーは ソートされ、上記の文字列値に対するUTF-8の強制に従って、以下のルールを適用して JSONオブジェクトのキーとして使用されます:
- 任意の文字列型のキーは直接使用されます
- encoding.TextMarshalersはマーシャルされます
- 整数キーは文字列に変換されます
ポインタ値は指している値としてエンコードされます。 nilポインタはnullのJSON値としてエンコードされます。
インターフェースの値は、インターフェースに含まれる値としてエンコードされます。 nilのインターフェース値は、nullのJSON値としてエンコードされます。
チャネル、複素数、および関数の値はJSONでエンコードすることはできません。 そのような値をエンコードしようとすると、Marshalは UnsupportedTypeErrorを返します。
JSONは循環データ構造を表現することはできませんし、Marshalはそれらを処理しません。 循環構造をMarshalに渡すとエラーが発生します。
Example ¶
package main import ( "github.com/shogo82148/std/encoding/json" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/os" ) func main() { 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"]}
func MarshalIndent ¶
MarshalIndentはMarshalと同様ですが、出力のフォーマットにIndentを適用します。 出力の各JSON要素は、インデントのネストに従ってprefixで始まり、 その後にindentの1つ以上のコピーが続く新しい行で始まります。
Example ¶
package main import ( "github.com/shogo82148/std/encoding/json" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/log" ) func main() { data := map[string]int{ "a": 1, "b": 2, } b, err := json.MarshalIndent(data, "<prefix>", "<indent>") if err != nil { log.Fatal(err) } fmt.Println(string(b)) }
Output: { <prefix><indent>"a": 1, <prefix><indent>"b": 2 <prefix>}
func Unmarshal ¶
Unmarshalは、JSONエンコードされたデータを解析し、結果をvが指す値に格納します。 もしvがnilまたはポインタでない場合、UnmarshalはInvalidUnmarshalErrorを返します。
Unmarshalは、Marshalが使用するエンコーディングの逆を使用し、 必要に応じてマップ、スライス、ポインタを割り当てます。 以下の追加ルールも適用されます:
JSONをポインタにアンマーシャルするために、Unmarshalはまず JSONがJSONリテラルnullであるケースを処理します。その場合、Unmarshalは ポインタをnilに設定します。それ以外の場合、UnmarshalはJSONを ポインタが指す値にアンマーシャルします。もしポインタがnilなら、Unmarshalは それが指す新しい値を割り当てます。
Unmarshalerインターフェースを実装する値にJSONをアンマーシャルするために、 Unmarshalはその値のUnmarshalJSONメソッドを呼び出します、 入力がJSON nullである場合も含みます。 それ以外の場合、もし値がencoding.TextUnmarshalerを実装していて、 入力がJSONの引用符で囲まれた文字列である場合、Unmarshalはその値の UnmarshalTextメソッドを引用符で囲まれていない形式の文字列で呼び出します。
JSONを構造体にアンマーシャルするために、Unmarshalは受信したオブジェクトの キーをMarshalが使用するキー(構造体のフィールド名またはそのタグ)と一致させます。 これは完全一致を優先しますが、大文字小文字を区別しない一致も受け入れます。 デフォルトでは、対応する構造体のフィールドがないオブジェクトのキーは無視されます (代替としてDecoder.DisallowUnknownFieldsを参照してください)。
インターフェース値にJSONをアンマーシャルするために、 Unmarshalは以下のいずれかをインターフェース値に格納します:
bool, for JSON booleans float64, for JSON numbers string, for JSON strings []interface{}, for JSON arrays map[string]interface{}, for JSON objects nil for JSON null
JSON配列をスライスにアンマーシャルするために、Unmarshalはスライスの長さを ゼロにリセットし、各要素をスライスに追加します。 特別なケースとして、空のJSON配列をスライスにアンマーシャルするために、 Unmarshalはスライスを新しい空のスライスで置き換えます。
Goの配列にJSON配列をアンマーシャルするために、Unmarshalは JSON配列の要素を対応するGoの配列の要素にデコードします。 もしGoの配列がJSON配列より小さい場合、 追加のJSON配列の要素は破棄されます。 もしJSON配列がGoの配列より小さい場合、 追加のGoの配列の要素はゼロ値に設定されます。
JSONオブジェクトをマップにアンマーシャルするために、Unmarshalは最初に使用するマップを確立します。 マップがnilの場合、Unmarshalは新しいマップを割り当てます。それ以外の場合、Unmarshalは 既存のマップを再利用し、既存のエントリを保持します。次に、UnmarshalはJSONオブジェクトから キーと値のペアをマップに格納します。マップのキーの型は、任意の文字列型、整数、 json.Unmarshalerを実装するもの、またはencoding.TextUnmarshalerを実装するものでなければなりません。
もしJSONエンコードされたデータに構文エラーが含まれている場合、UnmarshalはSyntaxErrorを返します。
もしJSON値が特定のターゲット型に適していない場合、 またはJSON数値がターゲット型をオーバーフローする場合、Unmarshalは そのフィールドをスキップし、可能な限りアンマーシャルを完了します。 もしもっと深刻なエラーが発生しなければ、Unmarshalは最初のそのようなエラーを 説明するUnmarshalTypeErrorを返します。いずれにせよ、問題のあるフィールドに続く すべてのフィールドがターゲットオブジェクトにアンマーシャルされることは保証されません。
JSONのnull値は、そのGoの値をnilに設定することでインターフェース、マップ、ポインタ、スライスにアンマーシャルされます。 nullはJSONで「存在しない」を意味することが多いため、JSONのnullを他のGoの型にアンマーシャルすると、 値には影響せず、エラーも発生しません。
引用符で囲まれた文字列をアンマーシャルするとき、無効なUTF-8または 無効なUTF-16サロゲートペアはエラーとして扱われません。 代わりに、それらはUnicodeの置換文字U+FFFDに置き換えられます。
Example ¶
package main import ( "github.com/shogo82148/std/encoding/json" "github.com/shogo82148/std/fmt" ) func main() { 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}]
func Valid ¶ added in v1.9.0
Validは、dataが有効なJSONエンコーディングであるかどうかを報告します。
Example ¶
package main import ( "github.com/shogo82148/std/encoding/json" "github.com/shogo82148/std/fmt" ) func main() { goodJSON := `{"example": 1}` badJSON := `{"example":2:]}}` fmt.Println(json.Valid([]byte(goodJSON)), json.Valid([]byte(badJSON))) }
Output: true false
Types ¶
type Decoder ¶
type Decoder struct {
// contains filtered or unexported fields
}
Decoderは、入力ストリームからJSON値を読み取り、デコードします。
Example ¶
この例では、Decoderを使用して一連の異なるJSON値をデコードします。
package main import ( "github.com/shogo82148/std/encoding/json" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/io" "github.com/shogo82148/std/log" "github.com/shogo82148/std/strings" ) func main() { const jsonStream = ` {"Name": "Ed", "Text": "Knock knock."} {"Name": "Sam", "Text": "Who's there?"} {"Name": "Ed", "Text": "Go fmt."} {"Name": "Sam", "Text": "Go fmt who?"} {"Name": "Ed", "Text": "Go fmt yourself!"} ` type Message struct { Name, Text string } dec := json.NewDecoder(strings.NewReader(jsonStream)) for { var m Message if err := dec.Decode(&m); err == io.EOF { break } else if err != nil { log.Fatal(err) } fmt.Printf("%s: %s\n", m.Name, m.Text) } }
Output: Ed: Knock knock. Sam: Who's there? Ed: Go fmt. Sam: Go fmt who? Ed: Go fmt yourself!
func NewDecoder ¶
NewDecoderは、rから読み取る新しいデコーダを返します。
デコーダは自身のバッファリングを導入し、 要求されたJSON値を超えてrからデータを読み取る可能性があります。
func (*Decoder) Buffered ¶ added in v1.1.0
Bufferedは、Decoderのバッファに残っているデータのリーダーを返します。 リーダーは次のDecode呼び出しまで有効です。
func (*Decoder) Decode ¶
Decodeは、入力から次のJSONエンコードされた値を読み取り、 それをvが指す値に格納します。
JSONをGoの値に変換する詳細については、Unmarshalのドキュメンテーションを参照してください。
Example (Stream) ¶
この例では、Decoderを使用してJSONオブジェクトのストリーミング配列をデコードします。
package main import ( "github.com/shogo82148/std/encoding/json" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/log" "github.com/shogo82148/std/strings" ) func main() { const jsonStream = ` [ {"Name": "Ed", "Text": "Knock knock."}, {"Name": "Sam", "Text": "Who's there?"}, {"Name": "Ed", "Text": "Go fmt."}, {"Name": "Sam", "Text": "Go fmt who?"}, {"Name": "Ed", "Text": "Go fmt yourself!"} ] ` type Message struct { Name, Text string } dec := json.NewDecoder(strings.NewReader(jsonStream)) // 開き括弧を読み込む t, err := dec.Token() if err != nil { log.Fatal(err) } fmt.Printf("%T: %v\n", t, t) // 配列が値を含んでいる間 for dec.More() { var m Message // 配列の値(Message)をデコードする err := dec.Decode(&m) if err != nil { log.Fatal(err) } fmt.Printf("%v: %v\n", m.Name, m.Text) } // 閉じ括弧を読み込む t, err = dec.Token() if err != nil { log.Fatal(err) } fmt.Printf("%T: %v\n", t, t) }
Output: json.Delim: [ Ed: Knock knock. Sam: Who's there? Ed: Go fmt. Sam: Go fmt who? Ed: Go fmt yourself! json.Delim: ]
func (*Decoder) DisallowUnknownFields ¶ added in v1.10.0
func (dec *Decoder) DisallowUnknownFields()
DisallowUnknownFieldsは、デコーダに、宛先が構造体であり、入力に宛先の いずれの非無視、エクスポートされたフィールドとも一致しないオブジェクトキーが含まれている場合に エラーを返すよう指示します。
func (*Decoder) InputOffset ¶ added in v1.14.0
InputOffsetは、現在のデコーダ位置の入力ストリームバイトオフセットを返します。 オフセットは、最近返されたトークンの終わりと次のトークンの始まりの位置を示します。
func (*Decoder) Token ¶ added in v1.5.0
Tokenは、入力ストリームの次のJSONトークンを返します。 入力ストリームの終わりでは、Tokenはnil, io.EOFを返します。
Tokenは、返す区切り文字[ ] { }が適切にネストされ、 マッチしていることを保証します:もしTokenが入力で予期しない 区切り文字に遭遇した場合、エラーを返します。
入力ストリームは、基本的なJSON値—bool, string, number, null—と、配列とオブジェクトの開始と終了を マークするための区切り文字[ ] { }のタイプDelimで構成されています。 コンマとコロンは省略されます。
Example ¶
この例では、Decoderを使用して一連の異なるJSON値をデコードします。
package main import ( "github.com/shogo82148/std/encoding/json" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/io" "github.com/shogo82148/std/log" "github.com/shogo82148/std/strings" ) func main() { const jsonStream = ` {"Message": "Hello", "Array": [1, 2, 3], "Null": null, "Number": 1.234} ` dec := json.NewDecoder(strings.NewReader(jsonStream)) for { t, err := dec.Token() if err == io.EOF { break } if err != nil { log.Fatal(err) } fmt.Printf("%T: %v", t, t) if dec.More() { fmt.Printf(" (more)") } fmt.Printf("\n") } }
Output: json.Delim: { (more) string: Message (more) string: Hello (more) string: Array (more) json.Delim: [ (more) float64: 1 (more) float64: 2 (more) float64: 3 json.Delim: ] (more) string: Null (more) <nil>: <nil> (more) string: Number (more) float64: 1.234 json.Delim: }
type Encoder ¶
type Encoder struct {
// contains filtered or unexported fields
}
Encoderは、JSON値を出力ストリームに書き込みます。
func (*Encoder) Encode ¶
Encodeは、vのJSONエンコーディングをストリームに書き込み、 その後に改行文字を追加します。
Goの値をJSONに変換する詳細については、Marshalのドキュメンテーションを参照してください。
func (*Encoder) SetEscapeHTML ¶ added in v1.7.0
SetEscapeHTMLは、問題のあるHTML文字がJSONの引用符で囲まれた文字列内でエスケープされるべきかどうかを指定します。 デフォルトの動作は、&, <, >を\u0026, \u003c, \u003eにエスケープして、 JSONをHTMLに埋め込む際に生じる可能性のある特定の安全性問題を回避します。
エスケープが出力の可読性を妨げる非HTML設定では、SetEscapeHTML(false)でこの動作を無効にします。
type InvalidUTF8Error
deprecated
type InvalidUTF8Error struct {
S string
}
Go 1.2より前では、InvalidUTF8Errorは、無効なUTF-8シーケンスを含む文字列値をエンコードしようとしたときに Marshalによって返されました。Go 1.2以降では、Marshalは代わりに無効なバイトをUnicodeの置換ルーンU+FFFDで 置き換えることにより、文字列を有効なUTF-8に強制します。
Deprecated: もう使用されていません。互換性のために保持されています。
func (*InvalidUTF8Error) Error ¶
func (e *InvalidUTF8Error) Error() string
type InvalidUnmarshalError ¶
InvalidUnmarshalErrorは、Unmarshalに渡された無効な引数を説明します。 (Unmarshalへの引数はnilでないポインタでなければなりません。)
func (*InvalidUnmarshalError) Error ¶
func (e *InvalidUnmarshalError) Error() string
type MarshalerError ¶
type MarshalerError struct { Type reflect.Type Err error // contains filtered or unexported fields }
MarshalerErrorは、MarshalJSONまたはMarshalTextメソッドを呼び出す際のエラーを表します。
func (*MarshalerError) Error ¶
func (e *MarshalerError) Error() string
func (*MarshalerError) Unwrap ¶ added in v1.13.0
func (e *MarshalerError) Unwrap() error
Unwrapは基礎となるエラーを返します。
type Number ¶ added in v1.1.0
type Number string
Numberは、JSONの数値リテラルを表します。
type RawMessage ¶
type RawMessage []byte
RawMessageは、生のエンコードされたJSON値です。 これはMarshalerとUnmarshalerを実装しており、 JSONのデコードを遅延させるか、JSONのエンコードを事前に計算するために使用できます。
Example (Marshal) ¶
この例では、RawMessageを使用して、マーシャル中に事前に計算されたJSONを使用します。
package main import ( "github.com/shogo82148/std/encoding/json" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/os" ) func main() { h := json.RawMessage(`{"precomputed": true}`) c := struct { Header *json.RawMessage `json:"header"` Body string `json:"body"` }{Header: &h, Body: "Hello Gophers!"} b, err := json.MarshalIndent(&c, "", "\t") if err != nil { fmt.Println("error:", err) } os.Stdout.Write(b) }
Output: { "header": { "precomputed": true }, "body": "Hello Gophers!" }
Example (Unmarshal) ¶
この例では、RawMessageを使用してJSONメッセージの一部の解析を遅延させます。
package main import ( "github.com/shogo82148/std/encoding/json" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/log" ) func main() { type Color struct { Space string Point json.RawMessage // カラースペースがわかるまでの解析を遅延させます } type RGB struct { R uint8 G uint8 B uint8 } type YCbCr struct { Y uint8 Cb int8 Cr int8 } var j = []byte(`[ {"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}}, {"Space": "RGB", "Point": {"R": 98, "G": 218, "B": 255}} ]`) var colors []Color err := json.Unmarshal(j, &colors) if err != nil { log.Fatalln("error:", err) } for _, c := range colors { var dst any switch c.Space { case "RGB": dst = new(RGB) case "YCbCr": dst = new(YCbCr) } err := json.Unmarshal(c.Point, dst) if err != nil { log.Fatalln("error:", err) } fmt.Println(c.Space, dst) } }
Output: YCbCr &{255 0 -10} RGB &{98 218 255}
func (RawMessage) MarshalJSON ¶
func (m RawMessage) MarshalJSON() ([]byte, error)
MarshalJSONは、mのJSONエンコーディングとしてmを返します。
func (*RawMessage) UnmarshalJSON ¶
func (m *RawMessage) UnmarshalJSON(data []byte) error
UnmarshalJSONは、*mをdataのコピーに設定します。
type SyntaxError ¶
type SyntaxError struct { Offset int64 // contains filtered or unexported fields }
SyntaxErrorは、JSON構文エラーの説明です。 JSONを解析できない場合、UnmarshalはSyntaxErrorを返します。
func (*SyntaxError) Error ¶
func (e *SyntaxError) Error() string
type Token ¶ added in v1.5.0
type Token any
Tokenは、以下の型のいずれかの値を保持します:
Delim、JSONの4つの区切り文字 [ ] { } のため bool、JSONのブール値のため float64、JSONの数値のため Number、JSONの数値のため string、JSONの文字列リテラルのため nil、JSONのnullのため
type UnmarshalFieldError
deprecated
type UnmarshalFieldError struct { Key string Type reflect.Type Field reflect.StructField }
UnmarshalFieldErrorは、JSONオブジェクトキーが エクスポートされていない(したがって書き込み不可能な)構造体フィールドにつながることを説明します。
Deprecated: もはや使用されていません。互換性のために保持されています。
func (*UnmarshalFieldError) Error ¶
func (e *UnmarshalFieldError) Error() string
type UnmarshalTypeError ¶
type UnmarshalTypeError struct { Value string Type reflect.Type Offset int64 Struct string Field string }
UnmarshalTypeErrorは、特定のGo型の値に対して適切でないJSON値を説明します。
func (*UnmarshalTypeError) Error ¶
func (e *UnmarshalTypeError) Error() string
type Unmarshaler ¶
Unmarshalerは、自分自身のJSON記述をアンマーシャルできる型によって実装されるインターフェースです。 入力は、JSON値の有効なエンコーディングであると想定できます。 UnmarshalJSONは、戻り値後にデータを保持したい場合、JSONデータをコピーする必要があります。
慣習的に、Unmarshal自体の振る舞いを近似するために、 UnmarshalersはUnmarshalJSON([]byte("null"))を何もしない操作として実装します。
type UnsupportedTypeError ¶
UnsupportedTypeErrorは、サポートされていない値の型をエンコードしようとしたときに Marshalによって返されます。
func (*UnsupportedTypeError) Error ¶
func (e *UnsupportedTypeError) Error() string
type UnsupportedValueError ¶
UnsupportedValueErrorは、サポートされていない値をエンコードしようとしたときに Marshalによって返されます。
func (*UnsupportedValueError) Error ¶
func (e *UnsupportedValueError) Error() string