编辑代码

package main

import (
    "fmt"
    "strings"
    "encoding/json"
)

type PrivilegeExtraInfo struct {
	PayerType   int64             `json:"payerType"`
	ProductType int64             `json:"ProductType"`
	BizData     map[string]string `json:"BizData"`
}

func main () {
    //JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。
    // fmt.Println("Hello JSRUN!   \n\n         - from Golang .")

    var extraStr = "{\"payerType\": 3, \"BizData\": {\"bizKey\": \"bizValue22\"}}"
    var extraInfo map[string]interface{}
    decoder := json.NewDecoder(strings.NewReader(extraStr))
	decoder.UseNumber() 
	if err := decoder.Decode(&extraInfo); err != nil {
		fmt.Println("解析失败")
		return
	}

    // 1. 取出数字
    payerType, err := extraInfo["payerType"].(json.Number).Int64()
	if err != nil {
		fmt.Printf("payerType断言为int64失败, err:%v\n", err)
		return
	}
    if payerType == int64(3) {
        fmt.Printf("类型正确,投保方: %v\n", payerType)
    } else {
        fmt.Printf("类型不对,投保方: %v\n", payerType)
    }

    // 2. 取出 map[string]string
    // 注意!不能通过 map[string]string 来取,而是要通过 map[string]interface{} 一级一级取
    bizData, ok := extraInfo["BizData"].(map[string]interface{})
    if !ok {
		fmt.Printf("BizData断言失败,err: %v\n", err)
		return
	}
    fmt.Printf("BizData 内容是:%v\n", bizData)

    if bizValue, ok := bizData["bizKey"]; ok {
        if realValue, ok := bizValue.(string); ok {
            fmt.Printf("BizValue 内容是:%v\n", realValue)
        }
    }
}