summaryrefslogtreecommitdiffstats
path: root/vendor/go.uber.org/zap/zapcore/json_encoder.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/go.uber.org/zap/zapcore/json_encoder.go')
-rw-r--r--vendor/go.uber.org/zap/zapcore/json_encoder.go30
1 files changed, 26 insertions, 4 deletions
diff --git a/vendor/go.uber.org/zap/zapcore/json_encoder.go b/vendor/go.uber.org/zap/zapcore/json_encoder.go
index 1006ba2b1..2dc67d81e 100644
--- a/vendor/go.uber.org/zap/zapcore/json_encoder.go
+++ b/vendor/go.uber.org/zap/zapcore/json_encoder.go
@@ -44,10 +44,15 @@ func getJSONEncoder() *jsonEncoder {
}
func putJSONEncoder(enc *jsonEncoder) {
+ if enc.reflectBuf != nil {
+ enc.reflectBuf.Free()
+ }
enc.EncoderConfig = nil
enc.buf = nil
enc.spaced = false
enc.openNamespaces = 0
+ enc.reflectBuf = nil
+ enc.reflectEnc = nil
_jsonPool.Put(enc)
}
@@ -56,6 +61,10 @@ type jsonEncoder struct {
buf *buffer.Buffer
spaced bool // include spaces after colons and commas
openNamespaces int
+
+ // for encoding generic values by reflection
+ reflectBuf *buffer.Buffer
+ reflectEnc *json.Encoder
}
// NewJSONEncoder creates a fast, low-allocation JSON encoder. The encoder
@@ -124,13 +133,24 @@ func (enc *jsonEncoder) AddInt64(key string, val int64) {
enc.AppendInt64(val)
}
+func (enc *jsonEncoder) resetReflectBuf() {
+ if enc.reflectBuf == nil {
+ enc.reflectBuf = bufferpool.Get()
+ enc.reflectEnc = json.NewEncoder(enc.reflectBuf)
+ } else {
+ enc.reflectBuf.Reset()
+ }
+}
+
func (enc *jsonEncoder) AddReflected(key string, obj interface{}) error {
- marshaled, err := json.Marshal(obj)
+ enc.resetReflectBuf()
+ err := enc.reflectEnc.Encode(obj)
if err != nil {
return err
}
+ enc.reflectBuf.TrimNewline()
enc.addKey(key)
- _, err = enc.buf.Write(marshaled)
+ _, err = enc.buf.Write(enc.reflectBuf.Bytes())
return err
}
@@ -213,12 +233,14 @@ func (enc *jsonEncoder) AppendInt64(val int64) {
}
func (enc *jsonEncoder) AppendReflected(val interface{}) error {
- marshaled, err := json.Marshal(val)
+ enc.resetReflectBuf()
+ err := enc.reflectEnc.Encode(val)
if err != nil {
return err
}
+ enc.reflectBuf.TrimNewline()
enc.addElementSeparator()
- _, err = enc.buf.Write(marshaled)
+ _, err = enc.buf.Write(enc.reflectBuf.Bytes())
return err
}