jsongen

package
v1.0.10 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 12, 2024 License: MIT Imports: 4 Imported by: 3

README

高效的 JSON 字符串生成器

forked from darjun/json-gen

使用原始数据项生成 JSON, 类似字符拼接, 支持常用类型.

性能比结构体序列化方式快挺多.

改动

  • 增加使用 buffer_pool
  • 增加添加原始 JSON 数据方法: RawString RawBytes
    • map: m.PutRawString m.PutRawBytes m.PutRawStringArray m.PutRawBytesArray
    • array: a.AppendRawString a.AppendRawBytes a.AppendRawStringArray a.AppendRawBytesArray
  • 减少一些不必要的转换
  • 增加 go mod

使用

简单使用请向下翻原文, 高性能场景建议配合 bytespool 使用:

package main

import (
	"fmt"

	"github.com/fufuok/bytespool"
	"github.com/fufuok/jsongen"
)

func main() {
	js := jsongen.NewMap()
	js.PutString("s", `a"b"\c`)
	js.PutFloat("f", 3.14)
	js.PutBool("b", false)
	jsArr := jsongen.NewArray()
	jsArr.AppendInt(7)
	jsArr.AppendStringArray([]string{"A", "B"})
	js.PutArray("sub", jsArr)
	js.PutRawString("raw", `{"n":null,"m":[1,"ff"]}`)

	size := js.Size()
	bs := bytespool.Get(size)
	defer bytespool.Put(bs)
	data := js.Serialize(bs)

	// 也可以直接使用 nil
	// data := js.Serialize(nil)

	fmt.Printf("%s\n", data)

	// Output:
	// {"s":"a\"b\"\\c","f":3.14,"b":false,"sub":[7,["A","B"]],"raw":{"n":null,"m":[1,"ff"]}}
}

json-gen

Build Status

起源

游戏服务端的很多操作(包括玩家的和非玩家的)需要传给公司中台收集汇总,根据运营的需求分析数据。中台那边要求传过去的数据为 JSON 格式。开始使用 Golang 标准库中的encoding/json,发现性能不够理想(因为序列化使用了反射,涉及多次内存分配)。由于数据原始格式都是map[string]interface{},且需要自己一个字段一个字段构造,于是我想可以在构造过程中就计算出最终 JSON 串的长度,那么就只需要一次内存分配了。

使用

下载:

$ go get github.com/darjun/json-gen

引入:

import (
  jsongen "github.com/darjun/json-gen"
)

构造数组或映射:

// 数组
a := jsongen.NewArray()
a.AppendUint(123)
a.AppendInt(-456)
data := a.Serialize(nil)
// string(data) == "[123,-456]"

// 映射
m := jsongen.NewMap()
m.PutUint("uintkey", 123)
m.PutInt("intkey", -456)
data := m.Serialize(nil)
// string(data) == `{"uintkey":123,"intkey":-456}`

当然类型可以无限嵌套:

subm := jsongen.NewMap()
subm.PutString("stringkey", "test string")

m := jsongen.NewMap()
m.PutUint("uintkey", 123)
m.PutUintArray("uintarray", []uint64{123,456,789})
m.PutMap("subm", subm)
data := m.Serialize(nil)
// string(data) == `{"uintkey":123,"uintarray":[123,456,789],"subm":{"stringkey":"test string"}}`

Benchmark

Library Time/op(ns) B/op allocs/op
encoding/json 22209 6673 127
darjun/json-gen 3300 1152 1

通常情况下,json-gen生成 JSON 串的性能是标准 JSON 库的10

Documentation

Overview

Package jsongen forked from darjun/json-gen

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Array

type Array []Value

Array 表示一个`json`数组

func NewArray

func NewArray() *Array

NewArray 创建一个`json`数组,返回其指针

func (*Array) AppendArray

func (a *Array) AppendArray(oa Array)

AppendArray 将`json`数组`oa`追加到数组`a`后

func (*Array) AppendBool

func (a *Array) AppendBool(b bool)

AppendBool 将`bool`类型的值`b`追加到数组`a`后

func (*Array) AppendBoolArray

func (a *Array) AppendBoolArray(b []bool)

AppendBoolArray 将`bool`数组`b`追加到数组`a`后

func (*Array) AppendFloat

func (a *Array) AppendFloat(f float64)

AppendFloat 将`float64`类型的值`f`追加到数组`a`后

func (*Array) AppendFloatArray

func (a *Array) AppendFloatArray(f []float64)

AppendFloatArray 将`float64`数组`f`追加到数组`a`后

func (*Array) AppendInt

func (a *Array) AppendInt(i int64)

AppendInt 将`int64`类型的值`i`追加到数组`a`后

func (*Array) AppendIntArray

func (a *Array) AppendIntArray(i []int64)

AppendIntArray 将`int64`数组`i`追加到数组`a`后

func (*Array) AppendMap

func (a *Array) AppendMap(m *Map)

AppendMap 将`Map`类型的值`m`追加到数组`a`后

func (*Array) AppendMapArray

func (a *Array) AppendMapArray(m []Map)

AppendMapArray 将`Map`数组`m`追加到数组`a`后

func (*Array) AppendRawBytes

func (a *Array) AppendRawBytes(b []byte)

func (*Array) AppendRawBytesArray

func (a *Array) AppendRawBytesArray(bs [][]byte)

func (*Array) AppendRawString

func (a *Array) AppendRawString(s string)

func (*Array) AppendRawStringArray

func (a *Array) AppendRawStringArray(ss []string)

func (*Array) AppendString

func (a *Array) AppendString(value string)

AppendString 将`string`类型的值`s`追加到数组`a`后

func (*Array) AppendStringArray

func (a *Array) AppendStringArray(s []string)

AppendStringArray 将`string`数组`s`追加到数组`a`后

func (*Array) AppendUint

func (a *Array) AppendUint(u uint64)

AppendUint 将`uint64`类型的值`u`追加到数组`a`后

func (*Array) AppendUintArray

func (a *Array) AppendUintArray(u []uint64)

AppendUintArray 将`uint64`数组`u`追加到数组`a`后

func (Array) Serialize

func (a Array) Serialize(buf []byte) []byte

Serialize 将`a`序列化为字符串,追加到`buf`后,返回新的`buf`

func (Array) Size

func (a Array) Size() int

Size 返回`a`在最终的`json`串中占有多少字节

type Map

type Map struct {
	// contains filtered or unexported fields
}

Map 表示一个`json`映射

func NewMap

func NewMap() *Map

NewMap 创建一个`json`映射返回其指针

func (*Map) PutArray

func (m *Map) PutArray(key string, a *Array)

PutArray 将`json`数组`a`与键`key`关联

func (*Map) PutBool

func (m *Map) PutBool(key string, b bool)

PutBool 将`bool`类型的值`b`与键`key`关联

func (*Map) PutBoolArray

func (m *Map) PutBoolArray(key string, b []bool)

PutBoolArray 将`bool`数组类型的值`b`与键`key`关联

func (*Map) PutFloat

func (m *Map) PutFloat(key string, f float64)

PutFloat 将`float64`类型的值`f`与键`key`关联

func (*Map) PutFloatArray

func (m *Map) PutFloatArray(key string, f []float64)

PutFloatArray 将`float64`数组类型的值`f`与键`key`关联

func (*Map) PutInt

func (m *Map) PutInt(key string, i int64)

PutInt 将`int64`类型的值`i`与键`key`关联

func (*Map) PutIntArray

func (m *Map) PutIntArray(key string, i []int64)

PutIntArray 将`int64`数组类型的值`i`与键`key`关联

func (*Map) PutMap

func (m *Map) PutMap(key string, om *Map)

PutMap 将`json`映射`om`与键`key`关联

func (*Map) PutRawBytes

func (m *Map) PutRawBytes(key string, b []byte)

func (*Map) PutRawBytesArray

func (m *Map) PutRawBytesArray(key string, bs [][]byte)

func (*Map) PutRawString

func (m *Map) PutRawString(key, s string)

func (*Map) PutRawStringArray

func (m *Map) PutRawStringArray(key string, ss []string)

func (*Map) PutString

func (m *Map) PutString(key, value string)

PutString 将`string`类型的值`value`与键`key`关联

func (*Map) PutStringArray

func (m *Map) PutStringArray(key string, s []string)

PutStringArray 将`string`数组类型的值`s`与键`key`关联

func (*Map) PutUint

func (m *Map) PutUint(key string, u uint64)

PutUint 将`uint64`类型的值`u`与键`key`关联

func (*Map) PutUintArray

func (m *Map) PutUintArray(key string, u []uint64)

PutUintArray 将`uint64`数组类型的值`u`与键`key`关联

func (Map) Serialize

func (m Map) Serialize(buf []byte) []byte

Serialize 将`m`序列化为字符串,追加到`buf`后,返回新的`buf`

func (Map) Size

func (m Map) Size() int

Size 返回`m`在最终的`json`串中占有多少字节

type QuotedValue

type QuotedValue string

QuotedValue 表示需要用"包裹起来的值,例如字符串

func (QuotedValue) Serialize

func (q QuotedValue) Serialize(buf []byte) []byte

Serialize 将`q`序列化为字符串,追加到`buf`后,返回新的`buf`

func (QuotedValue) Size

func (q QuotedValue) Size() int

Size 返回`q`在最终的`json`串中占有多少字节

type RawBytes

type RawBytes []byte

func (RawBytes) Serialize

func (b RawBytes) Serialize(buf []byte) []byte

func (RawBytes) Size

func (b RawBytes) Size() int

type RawString

type RawString string

func (RawString) Serialize

func (s RawString) Serialize(buf []byte) []byte

func (RawString) Size

func (s RawString) Size() int

type UnquotedValue

type UnquotedValue string

UnquotedValue 表示不需要用"包裹起来的值,例如整数,浮点数等

func (UnquotedValue) Serialize

func (u UnquotedValue) Serialize(buf []byte) []byte

Serialize 将`u`序列化为字符串,追加到`buf`后,返回新的`buf`

func (UnquotedValue) Size

func (u UnquotedValue) Size() int

Size 返回`u`在最终的`json`串中占有多少字节

type Value

type Value interface {
	// Serialize 将值序列化为字符串,追加到`buf`后,返回新的`buf`
	Serialize(buf []byte) []byte
	// Size 返回值在最终的`json`串中占有多少字节
	Size() int
}

Value 表示将要序列化到`json`字符串中的值

func EscapeString

func EscapeString(s string) Value

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL