From f32a307cafe0b5a5fe6780589b4869e4d4af4123 Mon Sep 17 00:00:00 2001 From: Nao Yonashiro Date: Mon, 13 Mar 2023 19:58:11 +0900 Subject: [PATCH] fix: fixed a problem that MarshalIndent does not work when UnorderedMap is specified (#435) --- encode_test.go | 16 ++++++++++++++++ internal/encoder/vm_color_indent/util.go | 7 ++++--- internal/encoder/vm_indent/util.go | 7 ++++--- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/encode_test.go b/encode_test.go index 3ff3fcb..f3b57bf 100644 --- a/encode_test.go +++ b/encode_test.go @@ -2630,6 +2630,22 @@ func TestCustomMarshalForMapKey(t *testing.T) { assertEq(t, "custom map key", string(expected), string(got)) } +func TestIssue417(t *testing.T) { + x := map[string]string{ + "b": "b", + "a": "a", + } + b, err := json.MarshalIndentWithOption(x, "", " ", json.UnorderedMap()) + assertErr(t, err) + + var y map[string]string + err = json.Unmarshal(b, &y) + assertErr(t, err) + + assertEq(t, "key b", "b", y["b"]) + assertEq(t, "key a", "a", y["a"]) +} + func TestIssue426(t *testing.T) { type I interface { Foo() diff --git a/internal/encoder/vm_color_indent/util.go b/internal/encoder/vm_color_indent/util.go index 60e4a8e..2395abe 100644 --- a/internal/encoder/vm_color_indent/util.go +++ b/internal/encoder/vm_color_indent/util.go @@ -189,7 +189,7 @@ func appendNullComma(ctx *encoder.RuntimeContext, b []byte) []byte { } func appendColon(_ *encoder.RuntimeContext, b []byte) []byte { - return append(b, ':', ' ') + return append(b[:len(b)-2], ':', ' ') } func appendMapKeyValue(ctx *encoder.RuntimeContext, code *encoder.Opcode, b, key, value []byte) []byte { @@ -229,8 +229,9 @@ func appendEmptyObject(_ *encoder.RuntimeContext, b []byte) []byte { func appendObjectEnd(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { last := len(b) - 1 - b[last] = '\n' - b = appendIndent(ctx, b, code.Indent-1) + // replace comma to newline + b[last-1] = '\n' + b = appendIndent(ctx, b[:last], code.Indent) return append(b, '}', ',', '\n') } diff --git a/internal/encoder/vm_indent/util.go b/internal/encoder/vm_indent/util.go index fca8f18..6cb745e 100644 --- a/internal/encoder/vm_indent/util.go +++ b/internal/encoder/vm_indent/util.go @@ -133,7 +133,7 @@ func appendNullComma(_ *encoder.RuntimeContext, b []byte) []byte { } func appendColon(_ *encoder.RuntimeContext, b []byte) []byte { - return append(b, ':', ' ') + return append(b[:len(b)-2], ':', ' ') } func appendMapKeyValue(ctx *encoder.RuntimeContext, code *encoder.Opcode, b, key, value []byte) []byte { @@ -173,8 +173,9 @@ func appendEmptyObject(_ *encoder.RuntimeContext, b []byte) []byte { func appendObjectEnd(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte { last := len(b) - 1 - b[last] = '\n' - b = appendIndent(ctx, b, code.Indent-1) + // replace comma to newline + b[last-1] = '\n' + b = appendIndent(ctx, b[:last], code.Indent) return append(b, '}', ',', '\n') }