diff --git a/extension_tests/decoder_test.go b/extension_tests/decoder_test.go index 0f1dd30..69c6d54 100644 --- a/extension_tests/decoder_test.go +++ b/extension_tests/decoder_test.go @@ -2,6 +2,7 @@ package test import ( "bytes" + "fmt" "github.com/json-iterator/go" "github.com/stretchr/testify/require" "strconv" @@ -47,6 +48,38 @@ func Test_customize_byte_array_encoder(t *testing.T) { should.Equal(`"abc"`, str) } +type CustomEncoderAttachmentTestStruct struct { + Value int32 `json:"value"` +} + +type CustomEncoderAttachmentTestStructEncoder struct {} + +func (c *CustomEncoderAttachmentTestStructEncoder) Encode(ptr unsafe.Pointer, stream *jsoniter.Stream) { + attachVal, ok := stream.Attachment.(int) + stream.WriteRaw(`"`) + stream.WriteRaw(fmt.Sprintf("%t %d", ok, attachVal)) + stream.WriteRaw(`"`) +} + +func (c *CustomEncoderAttachmentTestStructEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return false +} + +func Test_custom_encoder_attachment(t *testing.T) { + + jsoniter.RegisterTypeEncoder("test.CustomEncoderAttachmentTestStruct", &CustomEncoderAttachmentTestStructEncoder{}) + expectedValue := 17 + should := require.New(t) + buf := &bytes.Buffer{} + stream := jsoniter.NewStream(jsoniter.Config{SortMapKeys: true}.Froze(), buf, 4096) + stream.Attachment = expectedValue + val := map[string]CustomEncoderAttachmentTestStruct{"a": {}} + stream.WriteVal(val) + stream.Flush() + should.Nil(stream.Error) + should.Equal("{\"a\":\"true 17\"}", buf.String()) +} + func Test_customize_field_decoder(t *testing.T) { type Tom struct { field1 string diff --git a/reflect_map.go b/reflect_map.go index 08e9a39..730240e 100644 --- a/reflect_map.go +++ b/reflect_map.go @@ -290,6 +290,7 @@ func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { stream.WriteObjectStart() mapIter := encoder.mapType.UnsafeIterate(ptr) subStream := stream.cfg.BorrowStream(nil) + subStream.Attachment = stream.Attachment subIter := stream.cfg.BorrowIterator(nil) keyValues := encodedKeyValues{} for mapIter.HasNext() { diff --git a/reflect_struct_encoder.go b/reflect_struct_encoder.go index d0759cf..152e3ef 100644 --- a/reflect_struct_encoder.go +++ b/reflect_struct_encoder.go @@ -200,6 +200,7 @@ type stringModeStringEncoder struct { func (encoder *stringModeStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { tempStream := encoder.cfg.BorrowStream(nil) + tempStream.Attachment = stream.Attachment defer encoder.cfg.ReturnStream(tempStream) encoder.elemEncoder.Encode(ptr, tempStream) stream.WriteString(string(tempStream.Buffer()))