mirror of
https://github.com/golang/go.git
synced 2025-11-08 12:41:02 +00:00
encoding/json: encode \t as \t instead of \u0009
Shorter and easier to read form for a common character. LGTM=bradfitz R=adg, bradfitz CC=golang-codereviews, zimmski https://golang.org/cl/162340043
This commit is contained in:
parent
456df7c282
commit
aec37e7cb1
2 changed files with 59 additions and 1 deletions
|
|
@ -805,6 +805,9 @@ func (e *encodeState) string(s string) (int, error) {
|
||||||
case '\r':
|
case '\r':
|
||||||
e.WriteByte('\\')
|
e.WriteByte('\\')
|
||||||
e.WriteByte('r')
|
e.WriteByte('r')
|
||||||
|
case '\t':
|
||||||
|
e.WriteByte('\\')
|
||||||
|
e.WriteByte('t')
|
||||||
default:
|
default:
|
||||||
// This encodes bytes < 0x20 except for \n and \r,
|
// This encodes bytes < 0x20 except for \n and \r,
|
||||||
// as well as <, > and &. The latter are escaped because they
|
// as well as <, > and &. The latter are escaped because they
|
||||||
|
|
@ -878,9 +881,12 @@ func (e *encodeState) stringBytes(s []byte) (int, error) {
|
||||||
case '\r':
|
case '\r':
|
||||||
e.WriteByte('\\')
|
e.WriteByte('\\')
|
||||||
e.WriteByte('r')
|
e.WriteByte('r')
|
||||||
|
case '\t':
|
||||||
|
e.WriteByte('\\')
|
||||||
|
e.WriteByte('t')
|
||||||
default:
|
default:
|
||||||
// This encodes bytes < 0x20 except for \n and \r,
|
// This encodes bytes < 0x20 except for \n and \r,
|
||||||
// as well as < and >. The latter are escaped because they
|
// as well as <, >, and &. The latter are escaped because they
|
||||||
// can lead to security holes when user-controlled strings
|
// can lead to security holes when user-controlled strings
|
||||||
// are rendered into JSON and served to some browsers.
|
// are rendered into JSON and served to some browsers.
|
||||||
e.WriteString(`\u00`)
|
e.WriteString(`\u00`)
|
||||||
|
|
|
||||||
|
|
@ -478,3 +478,55 @@ func TestEncodePointerString(t *testing.T) {
|
||||||
t.Fatalf("*N = %d; want 42", *back.N)
|
t.Fatalf("*N = %d; want 42", *back.N)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var encodeStringTests = []struct {
|
||||||
|
in string
|
||||||
|
out string
|
||||||
|
}{
|
||||||
|
{"\x00", `"\u0000"`},
|
||||||
|
{"\x01", `"\u0001"`},
|
||||||
|
{"\x02", `"\u0002"`},
|
||||||
|
{"\x03", `"\u0003"`},
|
||||||
|
{"\x04", `"\u0004"`},
|
||||||
|
{"\x05", `"\u0005"`},
|
||||||
|
{"\x06", `"\u0006"`},
|
||||||
|
{"\x07", `"\u0007"`},
|
||||||
|
{"\x08", `"\u0008"`},
|
||||||
|
{"\x09", `"\t"`},
|
||||||
|
{"\x0a", `"\n"`},
|
||||||
|
{"\x0b", `"\u000b"`},
|
||||||
|
{"\x0c", `"\u000c"`},
|
||||||
|
{"\x0d", `"\r"`},
|
||||||
|
{"\x0e", `"\u000e"`},
|
||||||
|
{"\x0f", `"\u000f"`},
|
||||||
|
{"\x10", `"\u0010"`},
|
||||||
|
{"\x11", `"\u0011"`},
|
||||||
|
{"\x12", `"\u0012"`},
|
||||||
|
{"\x13", `"\u0013"`},
|
||||||
|
{"\x14", `"\u0014"`},
|
||||||
|
{"\x15", `"\u0015"`},
|
||||||
|
{"\x16", `"\u0016"`},
|
||||||
|
{"\x17", `"\u0017"`},
|
||||||
|
{"\x18", `"\u0018"`},
|
||||||
|
{"\x19", `"\u0019"`},
|
||||||
|
{"\x1a", `"\u001a"`},
|
||||||
|
{"\x1b", `"\u001b"`},
|
||||||
|
{"\x1c", `"\u001c"`},
|
||||||
|
{"\x1d", `"\u001d"`},
|
||||||
|
{"\x1e", `"\u001e"`},
|
||||||
|
{"\x1f", `"\u001f"`},
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEncodeString(t *testing.T) {
|
||||||
|
for _, tt := range encodeStringTests {
|
||||||
|
b, err := Marshal(tt.in)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Marshal(%q): %v", tt.in, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
out := string(b)
|
||||||
|
if out != tt.out {
|
||||||
|
t.Errorf("Marshal(%q) = %#q, want %#q", tt.in, out, tt.out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue