jsongen

package
v1.3.5 Latest Latest
Warning

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

Go to latest
Published: Aug 19, 2025 License: MIT Imports: 4 Imported by: 3

README

高效的 JSON 字符串生成器

forked from darjun/json-gen

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

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

改动

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

使用

package main

import (
	"fmt"

	"github.com/fufuok/utils/xjson/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"]}`)

	data := js.Serialize(nil)
	fmt.Printf("len: %d == %d\n", js.Size(), len(data))
	fmt.Printf("%s\n", data)

	// Output:
	// len: 86 == 86
	// {"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

Package jsongen Copyright 2024 Joshua J Baker. All rights reserved. Use of this source code is governed by an MIT-style license that can be found in the LICENSE file.

https://github.com/tidwall/gjson

Index

Constants

This section is empty.

Variables

View Source
var DisableEscapeHTML = false

DisableEscapeHTML will disable the automatic escaping of certain "problamatic" HTML characters when encoding to JSON. These character include '>', '<' and '&', which get escaped to \u003e, \u0026, and \u003c respectively.

This is a global flag and will affect all further gjson operations. Ideally, if used, it should be set one time before other gjson functions are called.

Functions

func AppendJSONString added in v1.3.0

func AppendJSONString(dst []byte, s string) []byte

AppendJSONString is a convenience function that converts the provided string to a valid JSON string and appends it to dst.

func EscapeString

func EscapeString(s string) string

EscapeString 转义 JSON 字符串, 并在前后加上双引号

Types

type Array

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

Array 数组类的 JSON 数据

func NewArray

func NewArray() *Array

NewArray 创建 JSON 数组, 无添加值时, 结果中至少附加一个空数组: []

func (*Array) AppendArray

func (a *Array) AppendArray(vv ...*Array)

AppendArray 追加单个或多个 array 到数组: [1,2] => [1,2,[{"A":1}],[true]]

func (*Array) AppendArrayArray added in v1.3.0

func (a *Array) AppendArrayArray(vv []*Array)

AppendArrayArray 追加 array 数组: [1,2] => [1,2,[[3],[4],[{"b":true}]]]

func (*Array) AppendBool

func (a *Array) AppendBool(vv ...bool)

AppendBool 追加单个或多个 bool 到数组: [1,2] => [1,2,true,false]

func (*Array) AppendBoolArray

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

AppendBoolArray 追加 bool 数组: [1,2] => [1,2,[true,false]]

func (*Array) AppendFloat

func (a *Array) AppendFloat(vv ...float64)

AppendFloat 追加单个或多个 float64 到数组: [1,2] => [1,2,3.1,4]

func (*Array) AppendFloatArray

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

AppendFloatArray 追加 float64 数组: [1,2] => [1,2,[3,4.1,5]]

func (*Array) AppendInt

func (a *Array) AppendInt(vv ...int64)

AppendInt 追加单个或多个 int64 到数组: [1,2] => [1,2,3,4]

func (*Array) AppendIntArray

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

AppendIntArray 追加 int64 数组: [1,2] => [1,2,[3,4,5]]

func (*Array) AppendMap

func (a *Array) AppendMap(vv ...*Map)

AppendMap 追加单个或多个 map 到数组: [1,2] => [1,2,{"A":1},{"b":true}]

func (*Array) AppendMapArray

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

AppendMapArray 追加 map 数组: [1,2] => [1,2,[{"A":1},{"b":true}]]

func (*Array) AppendRawBytes

func (a *Array) AppendRawBytes(bb ...[]byte)

AppendRawBytes 追加单个或多个原生 JSON 数据

func (*Array) AppendRawBytesArray

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

AppendRawBytesArray 追加原生 JSON 数据数组

func (*Array) AppendRawString

func (a *Array) AppendRawString(ss ...string)

AppendRawString 追加单个或多个原生 JSON 字符串, 如: [1,2] => [1,2,[2,{"A":1}]] a.AppendRawString(`[2,{"A":1}]`)

func (*Array) AppendRawStringArray

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

AppendRawStringArray 追加原生 JSON 字符串数组: [1,2] => [1,2,["x",[4],[{"b":true}]]] a.AppendRawStringArray([]string{`"x"`, `[4]`, `[{"b":true}]`})

func (*Array) AppendString

func (a *Array) AppendString(vv ...string)

AppendString 追加单个或多个 string 到数组: [1,2] => [1,2,"A","b"] a.AppendString("A", "b")

func (*Array) AppendStringArray

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

AppendStringArray 追加 string 数组: [1,2] => [1,2,["A","b"]] a.AppendStringArray([]string{"A","b"})

func (*Array) AppendUint

func (a *Array) AppendUint(vv ...uint64)

AppendUint 追加单个或多个 uint64 到数组: [1,2] => [1,2,3,4]

func (*Array) AppendUintArray

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

AppendUintArray 追加 uint64 数组: [1,2] => [1,2,[3,4,5]]

func (*Array) Serialize

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

func (*Array) Size

func (a *Array) Size() int

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, oa *Array)

PutArray 添加值为数组的数据项: {"A":[1,true,"x"]}

func (*Map) PutBool

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

func (*Map) PutBoolArray

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

func (*Map) PutFloat

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

func (*Map) PutFloatArray

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

func (*Map) PutInt

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

func (*Map) PutIntArray

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

func (*Map) PutMap

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

PutMap 添加值为对象(字典)的数据项, map 嵌套: {"A":{"sub":1}}

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, s string)

func (*Map) PutStringArray

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

func (*Map) PutUint

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

func (*Map) PutUintArray

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

PutUintArray 添加 uint64 数组数据项: {"A":[1,2]}

func (*Map) Serialize

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

func (*Map) Size

func (m *Map) Size() int

type RawBytes

type RawBytes []byte

RawBytes 附加原生 JSON 数据

func (RawBytes) Serialize

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

func (RawBytes) Size

func (b RawBytes) Size() int

type RawString

type RawString string

RawString 附加原生 JSON 数据字符串形式, 如直接附加: `[1,{"A":1}]`

func (RawString) Serialize

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

func (RawString) Size

func (s RawString) Size() int

type V added in v1.3.0

type V string

V 表示标准的 JSON 值,例如: 123,1.23,true 等 字符串值是以双引号包裹的字符串, 如: "abc"

func (V) Serialize added in v1.3.0

func (v V) Serialize(buf []byte) []byte

func (V) Size added in v1.3.0

func (v V) Size() int

type Value

type Value interface {
	// Serialize 将值序列化为字符串, 追加到 buf 并返回
	Serialize(buf []byte) []byte
	// Size 返回值最终字节数
	Size() int
}

Jump to

Keyboard shortcuts

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