diff --git a/jwriter/writer.go b/jwriter/writer.go index b0856ba..85fa440 100644 --- a/jwriter/writer.go +++ b/jwriter/writer.go @@ -10,8 +10,9 @@ import ( // Writer is a JSON writer. type Writer struct { - Error error - Buffer buffer.Buffer + EscapeLtGt bool + Error error + Buffer buffer.Buffer } // Size returns the size of the data that was written out. @@ -224,6 +225,10 @@ func (w *Writer) String(s string) { escape = '\\' case '"': escape = '"' + case '<', '>': + if !w.EscapeLtGt { + continue + } default: if c >= 0x20 { // no escaping is required diff --git a/tests/basic_test.go b/tests/basic_test.go index 7d18e3b..6ef2aa5 100644 --- a/tests/basic_test.go +++ b/tests/basic_test.go @@ -7,6 +7,7 @@ import ( "encoding/json" "github.com/mailru/easyjson" + "github.com/mailru/easyjson/jwriter" ) type testType interface { @@ -103,3 +104,25 @@ func TestParseNull(t *testing.T) { t.Errorf("Unmarshal() = %+v; want %+v", got, want) } } + +var testCasesEncodeLtGt = []struct { + Writer *jwriter.Writer + Encoded string +}{ + {&jwriter.Writer{ + EscapeLtGt: false, + }, encodeLtGtFalseWantString}, + {&jwriter.Writer{ + EscapeLtGt: true, + }, encodeLtGtTrueWantString}, +} + +func TestEncodeLtGt(t *testing.T) { + for i, test := range testCasesEncodeLtGt { + test.Writer.String(encodeLtGtString) + got := string(test.Writer.Buffer.BuildBytes()) + if got != test.Encoded { + t.Errorf("[%d] Encoded() = %+v; want %+v", i, got, test.Encoded) + } + } +} diff --git a/tests/data.go b/tests/data.go index aa8963f..510c3a3 100644 --- a/tests/data.go +++ b/tests/data.go @@ -440,3 +440,7 @@ type RequiredOptionalStruct struct { FirstName string `json:"first_name,required"` Lastname string `json:"last_name"` } + +var encodeLtGtString = `Username ` +var encodeLtGtFalseWantString = `"Username "` +var encodeLtGtTrueWantString = `"Username \u003cuser@example.com\u003e"`