Maksimov V Vladimir il y a 1 semaine
Parent
commit
d95cbe3481
2 fichiers modifiés avec 50 ajouts et 4 suppressions
  1. 12 4
      json/map.go
  2. 38 0
      json/z_test.go

+ 12 - 4
json/map.go

@@ -282,7 +282,7 @@ func (s Map) StringVal(key, defaultVal string) string {
 
 // Slce returns slice of interface{} by key
 // If key isn't defined or have a different type will be returned defaultVal arg value
-func (s Map) Slice(key string, defaultVal []interface{}) (res []interface{}) {
+func (s Map) Slice(key string, defaultVal []any) (res []interface{}) {
 	if arr, check := s[key].([]interface{}); check {
 		res = arr
 	} else {
@@ -351,7 +351,7 @@ func (s Map) LogPretty() {
 }
 
 // ToMap returns map[string]interface{} of the self object
-func (s Map) ToMap() map[string]interface{} { return map[string]interface{}(s) }
+func (s Map) ToMap() map[string]any { return map[string]any(s) }
 
 // Copy returns copied map (todo dipcopy)
 func (s Map) Copy() (res Map) {
@@ -372,12 +372,12 @@ func (s Map) Update(m Map) {
 	}
 }
 
-func (s Map) StorePtr(key string, val interface{}) interface{} {
+func (s Map) StorePtr(key string, val any) interface{} {
 	s[key] = &val
 	return &val
 }
 
-func (s Map) Variable(key string, ptr interface{}) bool {
+func (s Map) Variable(key string, ptr any) bool {
 	val, check := s[key]
 	if !check {
 		// value is not exists
@@ -397,3 +397,11 @@ func (s Map) Variable(key string, ptr interface{}) bool {
 	vElem.Set(rVal.Convert(vElem.Type()))
 	return true
 }
+
+func (s Map) UnmarshalField(key string, ptr any) error {
+	val, check := s[key]
+	if !check {
+		return fmt.Errorf("unexpected field [%s]", key)
+	}
+	return FillFromJM(ptr, val)
+}

+ 38 - 0
json/z_test.go

@@ -200,3 +200,41 @@ func TestMapVariable(t *testing.T) {
 	check := m.Variable("one", &val)
 	t.Log(check, val)
 }
+
+type UM struct {
+	ID   int64  `jm:"id"`
+	Name string `jm:"name"`
+}
+
+func TestUnmarshaler(t *testing.T) {
+	mObj := Map{
+		"um": Map{
+			"id":   10,
+			"name": "my-name",
+		},
+		"ums": []map[string]any{
+			{
+				"id":   11,
+				"name": "my-name-11",
+			},
+			{
+				"id":   12,
+				"name": "my-name-12",
+			},
+		},
+	}
+	var um UM
+	err := mObj.UnmarshalField("um", &um)
+	if err != nil {
+		t.Fatal(err)
+	}
+	t.Log(um)
+	var ums []*UM
+	err = mObj.UnmarshalField("ums", &ums)
+	if err != nil {
+		t.Fatal(err)
+	}
+	for i, v := range ums {
+		t.Log(i, *v)
+	}
+}