go_dreamfactory/lego/utils/codec/json/writer.go

217 lines
5.1 KiB
Go

package json
import (
"go_dreamfactory/lego/utils/codec"
"go_dreamfactory/lego/utils/codec/codecore"
"go_dreamfactory/lego/utils/codec/utils"
"github.com/modern-go/reflect2"
)
const indentionStep = 1
type JsonWriter struct {
err error
buf []byte
indention int
}
func (this *JsonWriter) GetReader(buf []byte) codecore.IReader {
return GetReader(buf)
}
func (this *JsonWriter) PutReader(r codecore.IReader) {
PutReader(r)
}
func (this *JsonWriter) GetWriter() codecore.IWriter {
return GetWriter()
}
func (this *JsonWriter) PutWriter(w codecore.IWriter) {
PutWriter(w)
}
//写入对象
func (this *JsonWriter) WriteVal(val interface{}) {
if nil == val {
this.WriteNil()
return
}
cacheKey := reflect2.RTypeOf(val)
encoder := codec.GetEncoder(cacheKey)
if encoder == nil {
typ := reflect2.TypeOf(val)
encoder = codec.EncoderOf(typ, defconf)
}
encoder.Encode(reflect2.PtrOf(val), this)
}
func (this *JsonWriter) WriteNil() {
this.writeFourBytes('n', 'u', 'l', 'l')
}
func (this *JsonWriter) WriteEmptyArray() {
this.writeTwoBytes('[', ']')
}
func (this *JsonWriter) WriteArrayStart() {
this.indention += indentionStep
this.writeByte('[')
this.writeIndention(0)
}
func (this *JsonWriter) WriteArrayEnd() {
this.writeIndention(indentionStep)
this.indention -= indentionStep
this.writeByte(']')
}
func (this *JsonWriter) WriteEmptyObject() {
this.writeTwoBytes('{', '}')
}
func (this *JsonWriter) WriteObjectStart() {
this.indention += indentionStep
this.writeByte('{')
this.writeIndention(0)
}
func (this *JsonWriter) WriteObjectEnd() {
this.writeIndention(indentionStep)
this.indention -= indentionStep
this.writeByte('}')
}
func (this *JsonWriter) WriteMemberSplit() {
this.writeByte(',')
this.writeIndention(0)
}
func (this *JsonWriter) WriteKVSplit() {
this.writeByte(':')
}
func (this *JsonWriter) WriteKeyStart() {
this.writeByte('"')
}
func (this *JsonWriter) WriteKeyEnd() {
this.writeByte('"')
}
func (this *JsonWriter) WriteObjectFieldName(val string) {
this.WriteString(val)
if this.indention > 0 {
this.writeTwoBytes(':', ' ')
} else {
this.writeByte(':')
}
}
func (this *JsonWriter) WriteBool(val bool) {
if val {
this.writeTrue()
} else {
this.writeFalse()
}
}
func (this *JsonWriter) WriteInt8(val int8) {
utils.WriteInt8ToString(&this.buf, val)
}
func (this *JsonWriter) WriteInt16(val int16) {
utils.WriteInt16ToString(&this.buf, val)
}
func (this *JsonWriter) WriteInt32(val int32) {
utils.WriteInt32ToString(&this.buf, val)
}
func (this *JsonWriter) WriteInt64(val int64) {
utils.WriteInt64ToString(&this.buf, val)
}
func (this *JsonWriter) WriteUint8(val uint8) {
utils.WriteUint8ToString(&this.buf, val)
}
func (this *JsonWriter) WriteUint16(val uint16) {
utils.WriteUint16ToString(&this.buf, val)
}
func (this *JsonWriter) WriteUint32(val uint32) {
utils.WriteUint32ToString(&this.buf, val)
}
func (this *JsonWriter) WriteUint64(val uint64) {
utils.WriteUint64ToString(&this.buf, val)
}
func (this *JsonWriter) WriteFloat32(val float32) {
utils.WriteFloat32ToString(&this.buf, val)
}
func (this *JsonWriter) WriteFloat64(val float64) {
utils.WriteFloat64ToString(&this.buf, val)
}
func (this *JsonWriter) WriteString(val string) {
valLen := len(val)
this.buf = append(this.buf, '"')
i := 0
for ; i < valLen; i++ {
c := val[i]
if c > 31 && c != '"' && c != '\\' {
this.buf = append(this.buf, c)
} else {
break
}
}
if i == valLen {
this.buf = append(this.buf, '"')
return
}
utils.WriteStringSlowPath(&this.buf, i, val, valLen)
}
func (this *JsonWriter) WriteBytes(val []byte) {
this.buf = append(this.buf, val...)
}
func (this *JsonWriter) Reset() {
this.buf = []byte{}
this.err = nil
this.indention = 0
return
}
func (this *JsonWriter) Buffer() []byte {
return this.buf
}
func (this *JsonWriter) Buffered() int {
return len(this.buf)
}
func (this *JsonWriter) Error() error {
return this.err
}
func (this *JsonWriter) SetErr(err error) {
this.err = err
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
// WriteTrue write true to stream
func (stream *JsonWriter) writeTrue() {
stream.writeFourBytes('t', 'r', 'u', 'e')
}
// WriteFalse write false to stream
func (stream *JsonWriter) writeFalse() {
stream.writeFiveBytes('f', 'a', 'l', 's', 'e')
}
func (this *JsonWriter) writeByte(c byte) {
this.buf = append(this.buf, c)
}
func (this *JsonWriter) writeTwoBytes(c1 byte, c2 byte) {
this.buf = append(this.buf, c1, c2)
}
func (this *JsonWriter) writeThreeBytes(c1 byte, c2 byte, c3 byte) {
this.buf = append(this.buf, c1, c2, c3)
}
func (this *JsonWriter) writeFourBytes(c1 byte, c2 byte, c3 byte, c4 byte) {
this.buf = append(this.buf, c1, c2, c3, c4)
}
func (this *JsonWriter) writeFiveBytes(c1 byte, c2 byte, c3 byte, c4 byte, c5 byte) {
this.buf = append(this.buf, c1, c2, c3, c4, c5)
}
func (stream *JsonWriter) writeIndention(delta int) {
if stream.indention == 0 {
return
}
stream.writeByte('\n')
toWrite := stream.indention - delta
for i := 0; i < toWrite; i++ {
stream.buf = append(stream.buf, ' ')
}
}