mirror of
https://github.com/go-gitea/gitea.git
synced 2025-10-04 07:46:28 +00:00
Drop json-iterator dependency (#35544)
This commit is contained in:
4
go.mod
4
go.mod
@@ -61,6 +61,7 @@ require (
|
|||||||
github.com/go-redsync/redsync/v4 v4.13.0
|
github.com/go-redsync/redsync/v4 v4.13.0
|
||||||
github.com/go-sql-driver/mysql v1.9.3
|
github.com/go-sql-driver/mysql v1.9.3
|
||||||
github.com/go-webauthn/webauthn v0.13.4
|
github.com/go-webauthn/webauthn v0.13.4
|
||||||
|
github.com/goccy/go-json v0.10.5
|
||||||
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f
|
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f
|
||||||
github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85
|
github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85
|
||||||
github.com/golang-jwt/jwt/v5 v5.3.0
|
github.com/golang-jwt/jwt/v5 v5.3.0
|
||||||
@@ -75,7 +76,6 @@ require (
|
|||||||
github.com/huandu/xstrings v1.5.0
|
github.com/huandu/xstrings v1.5.0
|
||||||
github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056
|
github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056
|
||||||
github.com/jhillyerd/enmime v1.3.0
|
github.com/jhillyerd/enmime v1.3.0
|
||||||
github.com/json-iterator/go v1.1.12
|
|
||||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
|
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
|
||||||
github.com/klauspost/compress v1.18.0
|
github.com/klauspost/compress v1.18.0
|
||||||
github.com/klauspost/cpuid/v2 v2.3.0
|
github.com/klauspost/cpuid/v2 v2.3.0
|
||||||
@@ -200,7 +200,6 @@ require (
|
|||||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
||||||
github.com/go-ini/ini v1.67.0 // indirect
|
github.com/go-ini/ini v1.67.0 // indirect
|
||||||
github.com/go-webauthn/x v0.1.24 // indirect
|
github.com/go-webauthn/x v0.1.24 // indirect
|
||||||
github.com/goccy/go-json v0.10.5 // indirect
|
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
|
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
|
||||||
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
|
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
|
||||||
github.com/golang-sql/sqlexp v0.1.0 // indirect
|
github.com/golang-sql/sqlexp v0.1.0 // indirect
|
||||||
@@ -220,6 +219,7 @@ require (
|
|||||||
github.com/hashicorp/go-retryablehttp v0.7.8 // indirect
|
github.com/hashicorp/go-retryablehttp v0.7.8 // indirect
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
||||||
github.com/josharian/intern v1.0.0 // indirect
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/kevinburke/ssh_config v1.4.0 // indirect
|
github.com/kevinburke/ssh_config v1.4.0 // indirect
|
||||||
github.com/klauspost/pgzip v1.2.6 // indirect
|
github.com/klauspost/pgzip v1.2.6 // indirect
|
||||||
github.com/libdns/libdns v1.1.1 // indirect
|
github.com/libdns/libdns v1.1.1 // indirect
|
||||||
|
@@ -8,8 +8,6 @@ import (
|
|||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/json" //nolint:depguard // this package wraps it
|
"encoding/json" //nolint:depguard // this package wraps it
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Encoder represents an encoder for json
|
// Encoder represents an encoder for json
|
||||||
@@ -31,70 +29,7 @@ type Interface interface {
|
|||||||
Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error
|
Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var DefaultJSONHandler = getDefaultJSONHandler()
|
||||||
DefaultJSONHandler = getDefaultJSONHandler()
|
|
||||||
|
|
||||||
_ Interface = StdJSON{}
|
|
||||||
_ Interface = JSONiter{}
|
|
||||||
)
|
|
||||||
|
|
||||||
// StdJSON implements Interface via encoding/json
|
|
||||||
type StdJSON struct{}
|
|
||||||
|
|
||||||
// Marshal implements Interface
|
|
||||||
func (StdJSON) Marshal(v any) ([]byte, error) {
|
|
||||||
return json.Marshal(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unmarshal implements Interface
|
|
||||||
func (StdJSON) Unmarshal(data []byte, v any) error {
|
|
||||||
return json.Unmarshal(data, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewEncoder implements Interface
|
|
||||||
func (StdJSON) NewEncoder(writer io.Writer) Encoder {
|
|
||||||
return json.NewEncoder(writer)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewDecoder implements Interface
|
|
||||||
func (StdJSON) NewDecoder(reader io.Reader) Decoder {
|
|
||||||
return json.NewDecoder(reader)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Indent implements Interface
|
|
||||||
func (StdJSON) Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error {
|
|
||||||
return json.Indent(dst, src, prefix, indent)
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONiter implements Interface via jsoniter
|
|
||||||
type JSONiter struct {
|
|
||||||
jsoniter.API
|
|
||||||
}
|
|
||||||
|
|
||||||
// Marshal implements Interface
|
|
||||||
func (j JSONiter) Marshal(v any) ([]byte, error) {
|
|
||||||
return j.API.Marshal(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unmarshal implements Interface
|
|
||||||
func (j JSONiter) Unmarshal(data []byte, v any) error {
|
|
||||||
return j.API.Unmarshal(data, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewEncoder implements Interface
|
|
||||||
func (j JSONiter) NewEncoder(writer io.Writer) Encoder {
|
|
||||||
return j.API.NewEncoder(writer)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewDecoder implements Interface
|
|
||||||
func (j JSONiter) NewDecoder(reader io.Reader) Decoder {
|
|
||||||
return j.API.NewDecoder(reader)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Indent implements Interface, since jsoniter don't support Indent, just use encoding/json's
|
|
||||||
func (j JSONiter) Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error {
|
|
||||||
return json.Indent(dst, src, prefix, indent)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Marshal converts object as bytes
|
// Marshal converts object as bytes
|
||||||
func Marshal(v any) ([]byte, error) {
|
func Marshal(v any) ([]byte, error) {
|
||||||
|
35
modules/json/jsongoccy.go
Normal file
35
modules/json/jsongoccy.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
// Copyright 2025 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package json
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"github.com/goccy/go-json"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ Interface = jsonGoccy{}
|
||||||
|
|
||||||
|
type jsonGoccy struct{}
|
||||||
|
|
||||||
|
func (jsonGoccy) Marshal(v any) ([]byte, error) {
|
||||||
|
return json.Marshal(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (jsonGoccy) Unmarshal(data []byte, v any) error {
|
||||||
|
return json.Unmarshal(data, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (jsonGoccy) NewEncoder(writer io.Writer) Encoder {
|
||||||
|
return json.NewEncoder(writer)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (jsonGoccy) NewDecoder(reader io.Reader) Decoder {
|
||||||
|
return json.NewDecoder(reader)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (jsonGoccy) Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error {
|
||||||
|
return json.Indent(dst, src, prefix, indent)
|
||||||
|
}
|
@@ -7,12 +7,10 @@ package json
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func getDefaultJSONHandler() Interface {
|
func getDefaultJSONHandler() Interface {
|
||||||
return JSONiter{jsoniter.ConfigCompatibleWithStandardLibrary}
|
return jsonGoccy{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func MarshalKeepOptionalEmpty(v any) ([]byte, error) {
|
func MarshalKeepOptionalEmpty(v any) ([]byte, error) {
|
||||||
|
34
modules/json/jsonv1.go
Normal file
34
modules/json/jsonv1.go
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
// Copyright 2025 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package json
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json" //nolint:depguard // this package wraps it
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
type jsonV1 struct{}
|
||||||
|
|
||||||
|
var _ Interface = jsonV1{}
|
||||||
|
|
||||||
|
func (jsonV1) Marshal(v any) ([]byte, error) {
|
||||||
|
return json.Marshal(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (jsonV1) Unmarshal(data []byte, v any) error {
|
||||||
|
return json.Unmarshal(data, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (jsonV1) NewEncoder(writer io.Writer) Encoder {
|
||||||
|
return json.NewEncoder(writer)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (jsonV1) NewDecoder(reader io.Reader) Decoder {
|
||||||
|
return json.NewDecoder(reader)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (jsonV1) Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error {
|
||||||
|
return json.Indent(dst, src, prefix, indent)
|
||||||
|
}
|
@@ -193,7 +193,7 @@ func TestHTTPClientDownload(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
endpoint: "https://invalid-json-response.io",
|
endpoint: "https://invalid-json-response.io",
|
||||||
expectedError: "/(invalid json|jsontext: invalid character)/",
|
expectedError: "/(invalid json|invalid character)/",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
endpoint: "https://valid-batch-request-download.io",
|
endpoint: "https://valid-batch-request-download.io",
|
||||||
@@ -301,7 +301,7 @@ func TestHTTPClientUpload(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
endpoint: "https://invalid-json-response.io",
|
endpoint: "https://invalid-json-response.io",
|
||||||
expectedError: "/(invalid json|jsontext: invalid character)/",
|
expectedError: "/(invalid json|invalid character)/",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
endpoint: "https://valid-batch-request-upload.io",
|
endpoint: "https://valid-batch-request-upload.io",
|
||||||
|
Reference in New Issue
Block a user