web-dev-qa-db-ja.com

golangのjson.Marshalがエラーを返す原因は何ですか?

docs から:

JSONは循環データ構造を表すことができず、Marshalはそれらを処理しません。巡回構造をMarshalに渡すと、無限再帰が発生します。

私はこの状況を経験しており、その結果ランタイムパニックが発生します。

私が思っているのは、json.Marshalが非nilエラーを返すパニックでない状況を実証する作業プログラムを誰でも提供できるかどうかです。最良の答えは、使用された入力を明確に含むです。

24
mdwhatcott

ジョナサンの答えを補足するために、json.Marshal関数はUnsupportedTypeErrorまたはUnsupportedValueErrorの2種類のエラーを返すことができます

ジョナサンが無効な型をマーシャルしようとすることで言ったように、最初のものが引き起こされる可能性があります:

_, err := json.Marshal(make(chan int))
_, ok := err.(*json.UnsupportedTypeError) // ok == true

一方、無効な値を渡すことにより、マーシャル関数がエラーを返すようにすることもできます。

_, err := json.Marshal(math.Inf(1))
_, ok := err.(*json.UnsupportedValueError) // ok == true
21
hbejgel

更新:エラーを誘発するためにmap [int] intの代わりにチャンネルを使用するようになりました


移動固有の構造(例: funcまたはchanシリアル化の拒否:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    value := make(chan int)
    _, err := json.Marshal(value)
    fmt.Println(err)
}
17
Jonathan Oliver