Skip to content

Commit 58e762d

Browse files
authored
Merge pull request #20 from itchyny/fix-escape-key-marshal
Fix escaping keys in MarshalJSON
2 parents edc893f + 34ae40f commit 58e762d

File tree

2 files changed

+20
-21
lines changed

2 files changed

+20
-21
lines changed

orderedmap.go

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -315,25 +315,24 @@ func sliceStringToSliceWithOrderedMaps(valueStr string, newSlice *[]interface{})
315315
}
316316

317317
func (o OrderedMap) MarshalJSON() ([]byte, error) {
318-
s := "{"
319-
for _, k := range o.keys {
318+
var buf bytes.Buffer
319+
buf.WriteByte('{')
320+
encoder := json.NewEncoder(&buf)
321+
encoder.SetEscapeHTML(o.escapeHTML)
322+
for i, k := range o.keys {
323+
if i > 0 {
324+
buf.WriteByte(',')
325+
}
320326
// add key
321-
kEscaped := strings.Replace(k, `"`, `\"`, -1)
322-
s = s + `"` + kEscaped + `":`
327+
if err := encoder.Encode(k); err != nil {
328+
return nil, err
329+
}
330+
buf.WriteByte(':')
323331
// add value
324-
v := o.values[k]
325-
buffer := new(bytes.Buffer)
326-
encoder := json.NewEncoder(buffer)
327-
encoder.SetEscapeHTML(o.escapeHTML)
328-
err := encoder.Encode(v)
329-
if err != nil {
330-
return []byte{}, err
332+
if err := encoder.Encode(o.values[k]); err != nil {
333+
return nil, err
331334
}
332-
s = s + buffer.String() + ","
333-
}
334-
if len(o.keys) > 0 {
335-
s = s[0 : len(s)-1]
336335
}
337-
s = s + "}"
338-
return []byte(s), nil
336+
buf.WriteByte('}')
337+
return buf.Bytes(), nil
339338
}

orderedmap_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,16 +132,16 @@ func TestMarshalJSON(t *testing.T) {
132132
v.Set("e", 1)
133133
v.Set("a", 2)
134134
o.Set("orderedmap", v)
135-
// double quote in key
136-
o.Set(`test"ing`, 9)
135+
// escape key
136+
o.Set("test\n\r\t\\\"ing", 9)
137137
// convert to json
138138
b, err := json.Marshal(o)
139139
if err != nil {
140140
t.Error("Marshalling json", err)
141141
}
142142
s := string(b)
143143
// check json is correctly ordered
144-
if s != `{"number":4,"string":"x","specialstring":"\\.\u003c\u003e[]{}_-","z":1,"a":2,"b":3,"slice":["1",1],"orderedmap":{"e":1,"a":2},"test\"ing":9}` {
144+
if s != `{"number":4,"string":"x","specialstring":"\\.\u003c\u003e[]{}_-","z":1,"a":2,"b":3,"slice":["1",1],"orderedmap":{"e":1,"a":2},"test\n\r\t\\\"ing":9}` {
145145
t.Error("JSON Marshal value is incorrect", s)
146146
}
147147
// convert to indented json
@@ -165,7 +165,7 @@ func TestMarshalJSON(t *testing.T) {
165165
"e": 1,
166166
"a": 2
167167
},
168-
"test\"ing": 9
168+
"test\n\r\t\\\"ing": 9
169169
}`
170170
if si != ei {
171171
fmt.Println(ei)

0 commit comments

Comments
 (0)