mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 11:28:24 +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