217 lines
5.1 KiB
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, ' ')
|
|
}
|
|
}
|