v0.0.470 Add GoextJsonMarshaller interface to call when marshalling json via gojson
All checks were successful
Build Docker and Deploy / Run goext test-suite (push) Successful in 2m51s

This commit is contained in:
Mike Schwörer 2024-06-11 19:34:48 +02:00
parent 2504ef00a0
commit 7fc73f1e93
Signed by: Mikescher
GPG Key ID: D3C7172E0A70F8CF
4 changed files with 59 additions and 2 deletions

View File

@ -1,5 +1,5 @@
package goext
const GoextVersion = "0.0.469"
const GoextVersion = "0.0.470"
const GoextVersionTimestamp = "2024-06-11T12:10:49+0200"
const GoextVersionTimestamp = "2024-06-11T19:34:48+0200"

View File

@ -769,6 +769,13 @@ type structFields struct {
}
func (se structEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
if v.CanAddr() && v.Addr().Type().Implements(goextJsonMarshallerType) {
if gejm, ok := v.Addr().Interface().(GoextJsonMarshaller); ok {
gejm.PreGoJsonMarshal()
}
}
next := byte('{')
FieldLoop:
for i := range se.fields.list {

13
gojson/interfaces.go Normal file
View File

@ -0,0 +1,13 @@
package json
import (
"reflect"
)
type GoextJsonMarshaller interface {
PreGoJsonMarshal()
}
var (
goextJsonMarshallerType = reflect.TypeOf((*GoextJsonMarshaller)(nil)).Elem()
)

37
gojson/interfaces_test.go Normal file
View File

@ -0,0 +1,37 @@
package json
import (
"fmt"
"testing"
)
type testStruct1 struct {
TS2 *testStruct2 `json:"ts2"`
}
type testStruct2 struct {
A string `json:"a"`
}
func (t *testStruct2) PreGoJsonMarshal() {
t.A = "Hello"
}
func TestGoextJsonMarshaller(t *testing.T) {
t1 := testStruct1{TS2: &testStruct2{}}
v, err := Marshal(t1)
if err != nil {
t.Fatal()
}
fmt.Printf("%s\n", v)
if string(v) != `{"ts2":{"a":"Hello"}}` {
t.Fatalf("PreGoJsonMarshal failed")
}
if t1.TS2.A != "Hello" {
t.Fatalf("PreGoJsonMarshal failed")
}
}