jsonenc

package
v1.37.3 Latest Latest
Warning

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

Go to latest
Published: Sep 17, 2026 License: MIT Imports: 3 Imported by: 0

Documentation

Overview

Package jsonenc is zip's single JSON entry point.

All JSON marshalling in zip — c.JSON(), c.Bind().Body(), typed.go's generic In/Out handlers, module.go's extension envelope — goes through Marshal / Unmarshal here. There is no other JSON path.

It is encoding/json/v2, called with the wire stated as options rather than taken from whatever the toolchain defaults to. That distinction is the whole point of this package: v2 answers differently from v1 in several places — it keeps a zero number or false under omitempty, writes a nil slice as [] and a nil map as {}, leaves `<` unescaped, matches field names case-sensitively, and does not sort a map's keys. This package once selected v2 on the goexperiment.jsonv2 build tag, which Go 1.27 sets by default, so moving a module to 1.27 silently changed what every response said.

So the options say v1's semantics, plus sorted keys, and every one of the remaining differences is a decision to make here, once, in view of the clients — never a default to inherit. What v2 gives in return is its API: Write and Read stream straight to and from the connection with no second copy, options are per call, and `omitzero` says what omitempty could not.

Per HIP-0106 "Wire protocol stack": JSON is the boundary format (ingress → gateway → subsystem handler). Inter-subsystem calls use ZAP-typed Go values. JSON marshalling happens at most once per request, at the subsystem handler boundary, through THIS package.

Brand policy: no third-party JSON library is allowed. Stdlib only. goccy/go-json, sonic, jsoniter, and friends are NOT permitted in the Hanzo Go stack — see HIP-0106 canonical Hanzo Go stack.

Index

Constants

View Source
const Variant = "encoding/json/v2"

Variant names the JSON implementation. zip.New() logs it once at startup.

Variables

This section is empty.

Functions

func Marshal

func Marshal(v any) ([]byte, error)

Marshal encodes v as JSON.

func Read added in v1.37.1

func Read(r io.Reader, v any) error

Read decodes the whole of r into v, so a request body is never buffered twice.

func Unmarshal

func Unmarshal(data []byte, v any) error

Unmarshal decodes data into v.

func Write added in v1.37.1

func Write(w io.Writer, v any) error

Write encodes v straight to w. A response written this way never exists as a second copy in memory, which is the whole reason to hold the encoder rather than a []byte.

Types

This section is empty.

Jump to

Keyboard shortcuts

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