github.com/zhangdapeng520/zdpgo_json@v0.1.5/examples/query1/main.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "reflect" 7 8 "github.com/zhangdapeng520/zdpgo_json" 9 ) 10 11 func main() { 12 /* 13 EndpointRule的内容大概如下 14 rule: 15 windows: 16 psh: 17 command: Get-WmiObject -class win32_operatingsystem | select -property *; 18 19 vul_tag: [["系统信息"],["win32_operatingsystem"]] 20 */ 21 data := make(map[string]interface{}) 22 windows := make(map[string]interface{}) 23 psh := make(map[string]string) 24 psh["command"] = "Get-WmiObject -class win32_operatingsystem | select -property *;" 25 windows["psh"] = psh 26 data["windows"] = windows 27 28 var vulTag [][]string 29 vulTag = append(vulTag, []string{"系统信息"}) 30 vulTag = append(vulTag, []string{"win32_operatingsystem"}) 31 data["vul_tag"] = vulTag 32 33 // 解析为JSON 34 jsonData, err := json.Marshal(data) 35 if err != nil { 36 panic(err) 37 } 38 fmt.Println("this json string : ", string(jsonData)) 39 40 // 重新解析为map 41 var dataMap map[string]interface{} 42 json.Unmarshal(jsonData, &dataMap) 43 fmt.Println("read data map successful", dataMap) 44 45 // 逐层提取 46 for k, v := range dataMap { 47 switch argValue := v.(type) { 48 case map[string]interface{}: // get command 49 fmt.Println("command", argValue) 50 // 得到shell类型和命令 51 for k1, v1 := range argValue { 52 fmt.Println("===========", k, k1, v1) 53 for k2, v2 := range v1.(map[string]interface{}) { 54 fmt.Println("xxxxxxxxxxxxxxxx", k, k1, k2, v2) 55 } 56 } 57 case []interface{}: // get vul tag 58 var vulTag1 [][]string 59 for _, v := range argValue { 60 var t []string 61 for _, vv := range v.([]interface{}) { 62 t = append(t, vv.(string)) 63 } 64 vulTag1 = append(vulTag1, t) 65 } 66 fmt.Println("vul tag", vulTag1) 67 default: 68 fmt.Println("unknown type") 69 } 70 } 71 72 // 直接json提取 73 jsonStr := `{"vul_tag":[["系统信息"],["win32_operatingsystem"]],"windows":{"psh":{"command":"Get-WmiObject -class win32_operatingsystem | select -property *;"}}}` 74 j := zdpgo_json.New() 75 vulTag2 := j.Query.Get(jsonStr, "vul_tag") 76 fmt.Println("vul tag 2 = ", vulTag2, reflect.TypeOf(vulTag2)) 77 fmt.Println(vulTag2.Raw, reflect.TypeOf(vulTag2.Raw)) 78 var vulTag3 [][]string 79 j.Loads(vulTag2.Raw, &vulTag3) 80 fmt.Println("vul tag 3 = ", vulTag3, reflect.TypeOf(vulTag3), vulTag3[0][0]) 81 82 // 提取commoand 83 command := j.Query.Get(jsonStr, "windows.psh.command") 84 fmt.Println(command.Raw) 85 86 // 提取vultag 87 fmt.Println("=============提取vul tag=======================") 88 vulTagArray := j.Query.Get(jsonStr, "vul_tag").Array() 89 fmt.Println(vulTagArray) 90 }