1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| type JSONStats struct { Keys []string Types map[string][]string }
func parseJSON(prefix string, jsonData []byte, stats *JSONStats) error { var data interface{} err := json.Unmarshal(jsonData, &data) if err != nil { return err } parseJSONObject(prefix, data, stats) return nil }
func parseJSONObject(prefix string, jsonObj interface{}, stats *JSONStats) { switch obj := jsonObj.(type) { case map[string]interface{}: for key, value := range obj { if !slices.Contains(stats.Keys, prefix+key) { stats.Keys = append(stats.Keys, prefix+key) } switch value.(type) { case []interface{}: if !slices.Contains(stats.Types[prefix+key], "array") { stats.Types[prefix+key] = append(stats.Types[prefix+key], "array") } parseJSONArray(prefix+key+".[]", value.([]interface{}), stats) case map[string]interface{}: if !slices.Contains(stats.Types[prefix+key], "object") { stats.Types[prefix+key] = append(stats.Types[prefix+key], "object") } parseJSONObject(prefix+key+".", value.(map[string]interface{}), stats) default: nodeType := fmt.Sprintf("%T", value) if !slices.Contains(stats.Types[prefix+key], nodeType) { stats.Types[prefix+key] = append(stats.Types[prefix+key], fmt.Sprintf("%T", value)) } } } } }
func parseJSONArray(prefix string, jsonArray []interface{}, stats *JSONStats) { for _, item := range jsonArray { switch item.(type) { case []interface{}: if _, ok := stats.Types[prefix]; !ok { stats.Keys = append(stats.Keys, prefix) stats.Types[prefix] = append(stats.Types[prefix], "array") } parseJSONArray(prefix+".[]", item.([]interface{}), stats) case map[string]interface{}: parseJSONObject(prefix, item.(map[string]interface{}), stats) default: if _, ok := stats.Types[prefix]; !ok { stats.Keys = append(stats.Keys, prefix) } nodeType := fmt.Sprintf("%T", item) if !slices.Contains(stats.Types[prefix], nodeType) { stats.Types[prefix] = append(stats.Types[prefix], nodeType) } } } }
|