Browse Source

Merge pull request #170 from olegshaldybin/marshal-enum-pointer

Fix custom marshaler for enum types
Tao Wen 8 years ago
parent
commit
92772579dd
3 changed files with 51 additions and 1 deletions
  1. 0 1
      feature_reflect.go
  2. 1 0
      feature_reflect_native.go
  3. 50 0
      jsoniter_enum_marshaler_test.go

+ 0 - 1
feature_reflect.go

@@ -476,7 +476,6 @@ func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error
 			templateInterface: extractInterface(templateInterface),
 			checkIsEmpty:      checkIsEmpty,
 		}
-		encoder = &optionalEncoder{encoder}
 		return encoder, nil
 	}
 	if typ.Implements(textMarshalerType) {

+ 1 - 0
feature_reflect_native.go

@@ -661,6 +661,7 @@ func (encoder *marshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
 	templateInterface.word = ptr
 	realInterface := (*interface{})(unsafe.Pointer(&templateInterface))
 	marshaler := (*realInterface).(json.Marshaler)
+
 	bytes, err := marshaler.MarshalJSON()
 	if err != nil {
 		stream.Error = err

+ 50 - 0
jsoniter_enum_marshaler_test.go

@@ -0,0 +1,50 @@
+package jsoniter
+
+import (
+	"fmt"
+	"testing"
+
+	"github.com/stretchr/testify/require"
+)
+
+type MyEnum int64
+
+const (
+	MyEnumA MyEnum = iota
+	MyEnumB
+)
+
+func (m *MyEnum) MarshalJSON() ([]byte, error) {
+	return []byte(fmt.Sprintf(`"foo-%d"`, int(*m))), nil
+}
+
+func (m *MyEnum) UnmarshalJSON(jb []byte) error {
+	switch string(jb) {
+	case `"foo-1"`:
+		*m = MyEnumB
+	default:
+		*m = MyEnumA
+	}
+	return nil
+}
+
+func Test_custom_marshaler_on_enum(t *testing.T) {
+	type Wrapper struct {
+		Payload interface{}
+	}
+	type Wrapper2 struct {
+		Payload MyEnum
+	}
+	should := require.New(t)
+
+	w := Wrapper{Payload: MyEnumB}
+
+	jb, err := Marshal(w)
+	should.Equal(nil, err)
+	should.Equal(`{"Payload":"foo-1"}`, string(jb))
+
+	var w2 Wrapper2
+	err = Unmarshal(jb, &w2)
+	should.Equal(nil, err)
+	should.Equal(MyEnumB, w2.Payload)
+}