github.com/fufuok/utils@v1.0.10/xjson/jsongen/jsongen.go (about)

     1  // Package jsongen forked from darjun/json-gen
     2  package jsongen
     3  
     4  import (
     5  	"encoding/json"
     6  	"strconv"
     7  	"unsafe"
     8  
     9  	"github.com/fufuok/utils/pools/bytespool"
    10  )
    11  
    12  // Value 表示将要序列化到`json`字符串中的值
    13  type Value interface {
    14  	// Serialize 将值序列化为字符串,追加到`buf`后,返回新的`buf`
    15  	Serialize(buf []byte) []byte
    16  	// Size 返回值在最终的`json`串中占有多少字节
    17  	Size() int
    18  }
    19  
    20  // QuotedValue 表示需要用"包裹起来的值,例如字符串
    21  type QuotedValue string
    22  
    23  // Serialize 将`q`序列化为字符串,追加到`buf`后,返回新的`buf`
    24  func (q QuotedValue) Serialize(buf []byte) []byte {
    25  	buf = append(buf, '"')
    26  	buf = append(buf, q...)
    27  	return append(buf, '"')
    28  }
    29  
    30  // Size 返回`q`在最终的`json`串中占有多少字节
    31  func (q QuotedValue) Size() int {
    32  	return len(q) + 2
    33  }
    34  
    35  // UnquotedValue 表示不需要用"包裹起来的值,例如整数,浮点数等
    36  type UnquotedValue string
    37  
    38  // Serialize 将`u`序列化为字符串,追加到`buf`后,返回新的`buf`
    39  func (u UnquotedValue) Serialize(buf []byte) []byte {
    40  	return append(buf, u...)
    41  }
    42  
    43  // Size 返回`u`在最终的`json`串中占有多少字节
    44  func (u UnquotedValue) Size() int {
    45  	return len(u)
    46  }
    47  
    48  type RawBytes []byte
    49  
    50  func (b RawBytes) Serialize(buf []byte) []byte {
    51  	return append(buf, b...)
    52  }
    53  
    54  func (b RawBytes) Size() int {
    55  	return len(b)
    56  }
    57  
    58  type RawString string
    59  
    60  func (s RawString) Serialize(buf []byte) []byte {
    61  	return append(buf, s...)
    62  }
    63  
    64  func (s RawString) Size() int {
    65  	return len(s)
    66  }
    67  
    68  // Array 表示一个`json`数组
    69  type Array []Value
    70  
    71  // NewArray 创建一个`json`数组,返回其指针
    72  func NewArray() *Array {
    73  	a := Array(make([]Value, 0, 1))
    74  	return &a
    75  }
    76  
    77  // Serialize 将`a`序列化为字符串,追加到`buf`后,返回新的`buf`
    78  func (a Array) Serialize(buf []byte) []byte {
    79  	if cap(buf) == 0 {
    80  		buf = bytespool.Make(a.Size())
    81  	}
    82  
    83  	buf = append(buf, '[')
    84  	count := len(a)
    85  	for i, e := range a {
    86  		buf = e.Serialize(buf)
    87  		if i != count-1 {
    88  			buf = append(buf, ',')
    89  		}
    90  	}
    91  	return append(buf, ']')
    92  }
    93  
    94  // Size 返回`a`在最终的`json`串中占有多少字节
    95  func (a Array) Size() int {
    96  	size := 0
    97  	for _, e := range a {
    98  		size += e.Size()
    99  	}
   100  
   101  	// for []
   102  	size += 2
   103  
   104  	if len(a) > 1 {
   105  		// for ,
   106  		size += len(a) - 1
   107  	}
   108  	return size
   109  }
   110  
   111  func (a *Array) AppendRawString(s string) {
   112  	*a = append(*a, RawString(s))
   113  }
   114  
   115  func (a *Array) AppendRawBytes(b []byte) {
   116  	*a = append(*a, RawBytes(b))
   117  }
   118  
   119  func (a *Array) AppendRawStringArray(ss []string) {
   120  	value := make([]Value, 0, len(ss))
   121  	for _, v := range ss {
   122  		value = append(value, RawString(v))
   123  	}
   124  	*a = append(*a, Array(value))
   125  }
   126  
   127  func (a *Array) AppendRawBytesArray(bs [][]byte) {
   128  	value := make([]Value, 0, len(bs))
   129  	for _, v := range bs {
   130  		value = append(value, RawBytes(v))
   131  	}
   132  	*a = append(*a, Array(value))
   133  }
   134  
   135  // AppendUint 将`uint64`类型的值`u`追加到数组`a`后
   136  func (a *Array) AppendUint(u uint64) {
   137  	value := strconv.FormatUint(u, 10)
   138  	*a = append(*a, UnquotedValue(value))
   139  }
   140  
   141  // AppendInt 将`int64`类型的值`i`追加到数组`a`后
   142  func (a *Array) AppendInt(i int64) {
   143  	value := strconv.FormatInt(i, 10)
   144  	*a = append(*a, UnquotedValue(value))
   145  }
   146  
   147  // AppendFloat 将`float64`类型的值`f`追加到数组`a`后
   148  func (a *Array) AppendFloat(f float64) {
   149  	value := strconv.FormatFloat(f, 'g', 10, 64)
   150  	*a = append(*a, UnquotedValue(value))
   151  }
   152  
   153  // AppendBool 将`bool`类型的值`b`追加到数组`a`后
   154  func (a *Array) AppendBool(b bool) {
   155  	value := strconv.FormatBool(b)
   156  	*a = append(*a, UnquotedValue(value))
   157  }
   158  
   159  // AppendString 将`string`类型的值`s`追加到数组`a`后
   160  func (a *Array) AppendString(value string) {
   161  	*a = append(*a, EscapeString(value))
   162  }
   163  
   164  // AppendMap 将`Map`类型的值`m`追加到数组`a`后
   165  func (a *Array) AppendMap(m *Map) {
   166  	*a = append(*a, m)
   167  }
   168  
   169  // AppendUintArray 将`uint64`数组`u`追加到数组`a`后
   170  func (a *Array) AppendUintArray(u []uint64) {
   171  	value := make([]Value, 0, len(u))
   172  	for _, v := range u {
   173  		value = append(value, UnquotedValue(strconv.FormatUint(v, 10)))
   174  	}
   175  	*a = append(*a, Array(value))
   176  }
   177  
   178  // AppendIntArray 将`int64`数组`i`追加到数组`a`后
   179  func (a *Array) AppendIntArray(i []int64) {
   180  	value := make([]Value, 0, len(i))
   181  	for _, v := range i {
   182  		value = append(value, UnquotedValue(strconv.FormatInt(v, 10)))
   183  	}
   184  	*a = append(*a, Array(value))
   185  }
   186  
   187  // AppendFloatArray 将`float64`数组`f`追加到数组`a`后
   188  func (a *Array) AppendFloatArray(f []float64) {
   189  	value := make([]Value, 0, len(f))
   190  	for _, v := range f {
   191  		value = append(value, UnquotedValue(strconv.FormatFloat(v, 'g', 10, 64)))
   192  	}
   193  	*a = append(*a, Array(value))
   194  }
   195  
   196  // AppendBoolArray 将`bool`数组`b`追加到数组`a`后
   197  func (a *Array) AppendBoolArray(b []bool) {
   198  	value := make([]Value, 0, len(b))
   199  	for _, v := range b {
   200  		value = append(value, UnquotedValue(strconv.FormatBool(v)))
   201  	}
   202  	*a = append(*a, Array(value))
   203  }
   204  
   205  // AppendStringArray 将`string`数组`s`追加到数组`a`后
   206  func (a *Array) AppendStringArray(s []string) {
   207  	value := make([]Value, 0, len(s))
   208  	for _, v := range s {
   209  		value = append(value, EscapeString(v))
   210  	}
   211  	*a = append(*a, Array(value))
   212  }
   213  
   214  // AppendMapArray 将`Map`数组`m`追加到数组`a`后
   215  func (a *Array) AppendMapArray(m []Map) {
   216  	value := make([]Value, 0, len(m))
   217  	for _, v := range m {
   218  		value = append(value, v)
   219  	}
   220  	*a = append(*a, Array(value))
   221  }
   222  
   223  // AppendArray 将`json`数组`oa`追加到数组`a`后
   224  func (a *Array) AppendArray(oa Array) {
   225  	*a = append(*a, oa)
   226  }
   227  
   228  // Map 表示一个`json`映射
   229  type Map struct {
   230  	keys   []string
   231  	values []Value
   232  }
   233  
   234  // Serialize 将`m`序列化为字符串,追加到`buf`后,返回新的`buf`
   235  func (m Map) Serialize(buf []byte) []byte {
   236  	if cap(buf) == 0 {
   237  		buf = bytespool.Make(m.Size())
   238  	}
   239  
   240  	buf = append(buf, '{')
   241  	count := len(m.keys)
   242  	for i, key := range m.keys {
   243  		buf = append(buf, '"')
   244  		buf = append(buf, key...)
   245  		buf = append(buf, '"')
   246  		buf = append(buf, ':')
   247  		buf = m.values[i].Serialize(buf)
   248  		if i != count-1 {
   249  			buf = append(buf, ',')
   250  		}
   251  	}
   252  	return append(buf, '}')
   253  }
   254  
   255  // Size 返回`m`在最终的`json`串中占有多少字节
   256  func (m Map) Size() int {
   257  	size := 0
   258  	for i, key := range m.keys {
   259  		// +2 for ", +1 for :
   260  		size += len(key) + 2 + 1
   261  		size += m.values[i].Size()
   262  	}
   263  
   264  	// +2 for {}
   265  	size += 2
   266  
   267  	if len(m.keys) > 1 {
   268  		// for ,
   269  		size += len(m.keys) - 1
   270  	}
   271  	return size
   272  }
   273  
   274  func (m *Map) put(key string, value Value) {
   275  	m.keys = append(m.keys, key)
   276  	m.values = append(m.values, value)
   277  }
   278  
   279  func (m *Map) PutRawString(key, s string) {
   280  	m.put(key, RawString(s))
   281  }
   282  
   283  func (m *Map) PutRawBytes(key string, b []byte) {
   284  	m.put(key, RawBytes(b))
   285  }
   286  
   287  func (m *Map) PutRawStringArray(key string, ss []string) {
   288  	value := make([]Value, 0, len(ss))
   289  	for _, v := range ss {
   290  		value = append(value, RawString(v))
   291  	}
   292  	m.put(key, Array(value))
   293  }
   294  
   295  func (m *Map) PutRawBytesArray(key string, bs [][]byte) {
   296  	value := make([]Value, 0, len(bs))
   297  	for _, v := range bs {
   298  		value = append(value, RawBytes(v))
   299  	}
   300  	m.put(key, Array(value))
   301  }
   302  
   303  // PutUint 将`uint64`类型的值`u`与键`key`关联
   304  func (m *Map) PutUint(key string, u uint64) {
   305  	value := strconv.FormatUint(u, 10)
   306  	m.put(key, UnquotedValue(value))
   307  }
   308  
   309  // PutInt 将`int64`类型的值`i`与键`key`关联
   310  func (m *Map) PutInt(key string, i int64) {
   311  	value := strconv.FormatInt(i, 10)
   312  	m.put(key, UnquotedValue(value))
   313  }
   314  
   315  // PutFloat 将`float64`类型的值`f`与键`key`关联
   316  func (m *Map) PutFloat(key string, f float64) {
   317  	value := strconv.FormatFloat(f, 'g', 10, 64)
   318  	m.put(key, UnquotedValue(value))
   319  }
   320  
   321  // PutBool 将`bool`类型的值`b`与键`key`关联
   322  func (m *Map) PutBool(key string, b bool) {
   323  	value := strconv.FormatBool(b)
   324  	m.put(key, UnquotedValue(value))
   325  }
   326  
   327  // PutString 将`string`类型的值`value`与键`key`关联
   328  func (m *Map) PutString(key, value string) {
   329  	m.put(key, EscapeString(value))
   330  }
   331  
   332  // PutUintArray 将`uint64`数组类型的值`u`与键`key`关联
   333  func (m *Map) PutUintArray(key string, u []uint64) {
   334  	value := make([]Value, 0, len(u))
   335  	for _, v := range u {
   336  		value = append(value, UnquotedValue(strconv.FormatUint(v, 10)))
   337  	}
   338  	m.put(key, Array(value))
   339  }
   340  
   341  // PutIntArray 将`int64`数组类型的值`i`与键`key`关联
   342  func (m *Map) PutIntArray(key string, i []int64) {
   343  	value := make([]Value, 0, len(i))
   344  	for _, v := range i {
   345  		value = append(value, UnquotedValue(strconv.FormatInt(v, 10)))
   346  	}
   347  	m.put(key, Array(value))
   348  }
   349  
   350  // PutFloatArray 将`float64`数组类型的值`f`与键`key`关联
   351  func (m *Map) PutFloatArray(key string, f []float64) {
   352  	value := make([]Value, 0, len(f))
   353  	for _, v := range f {
   354  		value = append(value, UnquotedValue(strconv.FormatFloat(v, 'g', 10, 64)))
   355  	}
   356  	m.put(key, Array(value))
   357  }
   358  
   359  // PutBoolArray 将`bool`数组类型的值`b`与键`key`关联
   360  func (m *Map) PutBoolArray(key string, b []bool) {
   361  	value := make([]Value, 0, len(b))
   362  	for _, v := range b {
   363  		value = append(value, UnquotedValue(strconv.FormatBool(v)))
   364  	}
   365  	m.put(key, Array(value))
   366  }
   367  
   368  // PutStringArray 将`string`数组类型的值`s`与键`key`关联
   369  func (m *Map) PutStringArray(key string, s []string) {
   370  	value := make([]Value, 0, len(s))
   371  	for _, v := range s {
   372  		value = append(value, EscapeString(v))
   373  	}
   374  	m.put(key, Array(value))
   375  }
   376  
   377  // PutArray 将`json`数组`a`与键`key`关联
   378  func (m *Map) PutArray(key string, a *Array) {
   379  	m.put(key, a)
   380  }
   381  
   382  // PutMap 将`json`映射`om`与键`key`关联
   383  func (m *Map) PutMap(key string, om *Map) {
   384  	m.put(key, om)
   385  }
   386  
   387  // NewMap 创建一个`json`映射返回其指针
   388  func NewMap() *Map {
   389  	return &Map{
   390  		keys:   make([]string, 0, 8),
   391  		values: make([]Value, 0, 8),
   392  	}
   393  }
   394  
   395  func EscapeString(s string) Value {
   396  	for i := 0; i < len(s); i++ {
   397  		if s[i] == '"' || s[i] == '\\' || s[i] < ' ' || s[i] > 0x7f {
   398  			b, _ := json.Marshal(s)
   399  			return UnquotedValue(*(*string)(unsafe.Pointer(&b)))
   400  		}
   401  	}
   402  	return QuotedValue(s)
   403  }