Golang

2017-10-03 9 views
-5
でUnmarshalTextとUnmarshalJsonの違い decode.go

何、それは言及:Golang

//アンマーシャリングJSONにUnmarshalerインタフェースを実装した値に、

//非整列化は、その値のUnmarshalJSONメソッドを呼び出します

//入力がJSON nullの場合。

//値がencoding.TextUnmarshaler

//を実装し、入力はJSON引用符で囲まれた文字列であればそうでない場合は、非整列化は、文字列の引用符で囲まれていない形式でその値の

// UnmarshalTextメソッドを呼び出します。

UnmarshalTextUnmarshalJSONの違いは何ですか?どちらが優先されますか?単に

答えて

2

  • UnmarshalTextはテキストエンコードされた値をアンマーシャル。
  • UnmarshalJSONはJSONエンコードされた値を非整列化します。

どちらが望ましいかは、実行していることによって異なります。

JSONエンコードは、RFC 7159で定義されています。 JSONドキュメントを使用している場合、JSONエンコーディングを使用する必要があります。

テキストエンコーディングには標準はなく、完全に実装に依存します。 Goはいくつかのタイプのテキスト(非)マーシャラーを実装していますが、他のアプリケーションがこれらのフォーマットを理解するという保証はありません。

テキストエンコーディングは、URLクエリパラメータ、HTMLフォーム、または他の緩やかに定義されたフォーマットなどの場合に最も一般的に使用されます。

この問題で選択肢がある場合は、おそらくJSONを使用する方がよいでしょう。しかし、もう一度、それはあなたが何を最も理にかなっているかに依存します。

GoのJSON unmarshalerに関連して、JSONのunmarshalerは型のUnmarshalJSONメソッドが定義されている場合はそれを呼び出し、それが定義されている場合はUnmarshalTextに戻ります。

JSONを使用することがわかっている場合は、UnmarshalJSON関数を絶対に定義する必要があります。

一般的には、非JSONコンテキストで使用することを期待している場合にのみUnmarshalTextを作成し、JSONマーシャラーも複製しなくてもそれを使用するという利点があります(実際に同じ実装が動作する場合JSONの場合)。

0

Per the documentation:Unmarshalerインタフェースを実装値にアンマーシャルJSONに

、 非整列化は、入力がJSONヌルである場合など、その値のUnmarshalJSONメソッドを呼び出します。そうでない場合、値が encoding.TextUnmarshalerを実装し、入力がJSON引用文字列である場合、 Unmarshalは、その値のUnmarshalTextメソッドを、引用符なしの という形式の文字列で呼び出します。

意味:カスタムロジックを使用してJSONを非マーシャル化したい場合、UnmarshalJSONを使用します。 JSONドキュメントの文字列フィールドでテキストを取り出し、それを特別な方法でデコードする場合(つまり、stringタイプフィールドに書き込むのではなく解析する場合)、UnmarshalTextを使用します。たとえば、net.IPUnmarshalTextを実装しているため、"ipAddress": "1.2.3.4"のような文字列値を指定し、net.IPフィールドに非マーシャルします。 net.IPUnmarshalTextが実装されていない場合は、基礎となるタイプのJSON表現([]byte)のみを非整列化することができます。