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 }