| 980 | } |
| 981 | |
| 982 | func deepEqualJSON(a, b any) bool { |
| 983 | switch valA := a.(type) { |
| 984 | case map[string]any: |
| 985 | valB, ok := b.(map[string]any) |
| 986 | if !ok || len(valA) != len(valB) { |
| 987 | return false |
| 988 | } |
| 989 | for key, subA := range valA { |
| 990 | subB, ok1 := valB[key] |
| 991 | if !ok1 || !deepEqualJSON(subA, subB) { |
| 992 | return false |
| 993 | } |
| 994 | } |
| 995 | return true |
| 996 | case []any: |
| 997 | sliceB, ok := b.([]any) |
| 998 | if !ok || len(valA) != len(sliceB) { |
| 999 | return false |
| 1000 | } |
| 1001 | for i := range valA { |
| 1002 | if !deepEqualJSON(valA[i], sliceB[i]) { |
| 1003 | return false |
| 1004 | } |
| 1005 | } |
| 1006 | return true |
| 1007 | case float64: |
| 1008 | valB, ok := b.(float64) |
| 1009 | if !ok { |
| 1010 | return false |
| 1011 | } |
| 1012 | return valA == valB |
| 1013 | case string: |
| 1014 | valB, ok := b.(string) |
| 1015 | if !ok { |
| 1016 | return false |
| 1017 | } |
| 1018 | return valA == valB |
| 1019 | case bool: |
| 1020 | valB, ok := b.(bool) |
| 1021 | if !ok { |
| 1022 | return false |
| 1023 | } |
| 1024 | return valA == valB |
| 1025 | case nil: |
| 1026 | return b == nil |
| 1027 | default: |
| 1028 | return false |
| 1029 | } |
| 1030 | } |