1. json 转 数组
数据表中存储的json数据,包含字符串和整型,读取出来要重写数据;
则需要讲数据设置为interface{},
// 数据表数据:[{"age": 13, "sort": 1, "name": "张三", "class_id": 82}, {"age": 14, "sort": 2, "name": "李四", "class_id": 82}]
// 数据库json 转 数组,读取并更改
var classMsg []map[string]interface{}
// 转数据
var err = json.Unmarshal([]byte(roleDialog.DialogContent), &classMsg)
if err == nil {
fmt.Println(classMsg)
// 打印结果 -----------------------
// [map[name:张三 age:13 class_id:82 sort:1] map[name:李四 age:14 class_id:82 sort:2]]
// 打印结果 End -----------------------
}
已经讲json转成数组结构;
2. interface{} 中的数据转string,int
根据上面获取的数据,需要读取class_id 中的数据,并处理,处理源的数据类型为int;
然而在interface{}中的数值为float64,不能直接使用,会报错:【interface conversion: interface {} is float64, not int】
fmt.Printf("name: %v, type: %v \n", classMsg[0]["class_id"], reflect.TypeOf(classMsg[0]["class_id"]))
// 打印结果 ------------------
// name: 82, type: float64
// 打印结果 End -----------------------
classId := int(classMsg[0]["class_id"].(float64))
fmt.Printf("name: %v, type: %v \n", classId, reflect.TypeOf(classId))
// 打印结果 ------------------
// name: 82, type: int
// 打印结果 End -----------------------
3. []interface{} 转数组
- 简单数据结构
数据库存放数据json:其中包含字符串和数组
classMsg:{“level”: “3”, “class_id”: “173”, “students”: [174]}
// 类型[]interface{}, 转数组
var students = classMsg["students"]
fmt.Println(students) // [174]
fmt.Println(reflect.TypeOf(students)) // []interface {}
value := reflect.ValueOf(students)
fmt.Println(value) // [174]
var res []uint
for i := 0; i < value.Len(); i++ {
res = append(res, uint(value.Index(i).Interface().(float64)))
}
fmt.Println(res) // [174]
fmt.Println(reflect.TypeOf(res)) // []uint
- 复杂的数据结构:(数据存储成这样我也是不想的 T-T)
{“info”: [{“intro”: 111, “title”: 1, “audio_id”: 1247, “listorder”: 1}, {“intro”: 222, “title”: 2, “audio_id”: 1131, “listorder”: 2}], “dlgs_id”: 0}
类型转换,类型断言
var behaviorInfo map[string]interface{}
err:= json.Unmarshal([]byte(originPoint.BehaviorInfo), &behaviorInfo)
// {"info": [{"intro": 111, "title": 1, "audio_id": 1247, "listorder": 1}, {"intro": 222, "title": 2, "audio_id": 1131, "listorder": 2}], "dlgs_id": 0}
if err == nil {
fmt.Println(behaviorInfo["info"])
info := reflect.ValueOf(behaviorInfo["info"])
var temInfo []interface{} = info.Interface().([]interface{})
// [{"intro": 111, "title": 1, "audio_id": 1247, "listorder": 1}, {"intro": 222, "title": 2, "audio_id": 1131, "listorder": 2}]
fmt.Println(temInfo)
for _, infoItem := range temInfo {
var temInfoItem = reflect.ValueOf(infoItem)
var temInfoItem1 map[string]interface{} = temInfoItem.Interface().(map[string]interface{})
// {"intro": 111, "title": 1, "audio_id": 1247, "listorder": 1}
fmt.Println(temInfoItem1["audio_id"])
/*for k, v := range temInfoItem1 {
fmt.Printf("key: %v, value: %v \n", k, v)
}*/
}
}
4. 字符串与数组互转
字符串转数组
字符串数据:“张三,李四,王五”
strings.Split(数组, “分隔符”)
var str = "张三,李四,王五"
fmt.Printf("value: %v, type: %v \n", str, reflect.TypeOf(str))
// value: 张三,李四,王五, type: string
var arr = strings.Split(str, ",")
fmt.Println(arr)
// [张三 李四 王五]
数组转字符串
var temStr = ""
for _, value = range arr {
if len(temStr) >0 {
temStr = temStr + "," + value
} else {
temStr = value
}
}
// 字符串转int
intValue, _ := strconv.Atoi(stringValue)
// int 转字符串
stringValue := strconv.Itoa(intValue)
5. 判断数组中是否有某个键存在
if _, ok := arr["key"]; ok {
// 存在
}
6. 正则和替换
regexpAudio := regexp.MustCompile("\"audio_id\": (\"(.*?)\"|(\\d*))")
audioValue := regexpAudio.FindAllString(originPoint.BehaviorInfo, -1)
fmt.Println(audioValue)
fmt.Println("---------------------")
fmt.Println(originPoint.BehaviorInfo)
for _, value := range audioValue {
var temAudioId = strings.Split(value, ": ")[1]
audioId, _ := strconv.Atoi(temAudioId)
var replaceId = strconv.Itoa(int(playDataMap["audio"][uint(audioId)]))
// 字符替换
originPoint.BehaviorInfo = strings.Replace(originPoint.BehaviorInfo, " "+temAudioId, " "+replaceId, -1)
}
fmt.Println(originPoint.BehaviorInfo)