在一次fabric chaincode的开发过程中,计划使用leveldb数据库,所以存储的数据都是key,value类型的数据。value 是一个json 类型的字符串。由于希望项目不用每张表都建立一个具体的结构,这样项目的复用性也可以更好的提高。所以最后决定直接通过json 字符串解析成map 类型的结构进行开发。下面详细介绍json 在golang 里面的简单特性。
一、Json和struct互换
(1)Json转struct例子:
package main
import (
"fmt"
"encoding/json"
)
type People struct {
Name string `json:"name_title"`
Age int `json:"age_size"`
}
func JsonToStructDemo(){
jsonStr := `
{
"name_title": "jqw"
"age_size":12
}
`
var people People
json.Unmarshal([]byte(jsonStr), &people)
fmt.Println(people)
}
func main(){
JsonToStructDemo()
}
2)struct转json
在结构体中引入tag标签,这样匹配的时候json串对应的字段名需要与tag标签中定义的字段名匹配,当然tag中定义的名称不需要首字母大写,且对应的json串中字段名仍然大小写不敏感。此时,结构体中对应的字段名可以不用和匹配的一致,但是首字母必须大写,只有大写才是可对外提供访问的。
例子:
package main
import (
"fmt"
"encoding/json"
)
type People struct {
Name string `json:"name_title"`
Age int `json:"age_size"`
}
func StructToJsonDemo(){
p := People{
Name: "jqw",
Age: 18,
}
jsonBytes, err := json.Marshal(p)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(jsonBytes))
}
func main(){
StructToJsonDemo()
}
二、json和map互转
(1)json转map例子:
func JsonToMapDemo(){
jsonStr := `
{
"name": "jqw",
"age": 18
}
`
var mapResult map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &mapResult)
if err != nil {
fmt.Println("JsonToMapDemo err: ", err)
}
fmt.Println(mapResult)
}
(2)map转Json例子
func MapToJsonDemo1(){
mapInstances := []map[string]interface{}{}
instance_1 := map[string]interface{}{"name": "John", "age": 10}
instance_2 := map[string]interface{}{"name": "Alex", "age": 12}
mapInstances = append(mapInstances, instance_1, instance_2)
jsonStr, err := json.Marshal(mapInstances)
if err != nil {
fmt.Println("MapToJsonDemo err: ", err)
}
fmt.Println(string(jsonStr))
}
func MapToJsonDemo2(){
b, _ := json.Marshal(map[string]int{"test":1, "try":2})
fmt.Println(string(b))
}
验证一个字符串是否是json类型的字符串
package main
import (
"encoding/json"
"fmt"
)
func isJSONString(s string) bool {
var js string
return json.Unmarshal([]byte(s), &js) == nil
}
func isJSON(s string) bool {
var js map[string]interface{}
return json.Unmarshal([]byte(s), &js) == nil
}
func main() {
var tests = []string{
`"Platypus"`,
`Platypus`,
`{"id":"1"}`,
}
for _, t := range tests {
fmt.Printf("isJSONString(%s) = %v\n", t, isJSONString(t))
fmt.Printf("isJSON(%s) = %v\n\n", t, isJSON(t))
}
}
//运行结果
isJSONString("Platypus") = true
isJSON("Platypus") = false
isJSONString(Platypus) = false
isJSON(Platypus) = false
isJSONString({"id":"1"}) = false
isJSON({"id":"1"}) = true