golang如何修改json文件内容

使用一个例子说明golang如何访问和修改json文件;主要分三步:



从文件读入json串
把json串转变成golang对象
遍历或者修改json值
写回文件

{
“user”: {
“mspid”: “admin”,
“email”: “admin@domain.com”
},

“nodes”: [
{

“name”: “node1”,
“location”: “node1.domain.com:8080”
},

{

“name”: “node2”,
“location”: “node2.domain.com:8080”
}

]
}



我们的目标是把node1和node2的location域换掉。



import (
“fmt”
“io/ioutil”
“encoding/json”
)



func HandleJson(jsonFile string, outFile string) error {
// Read json buffer from jsonFile
byteValue, err := ioutil.ReadFile(jsonFile)
if err != nil {
return err
}



// We have known the outer json object is a map, so we define  result as map.
// otherwise, result could be defined as slice if outer is an array
var result map[string]interface{}
err = json.Unmarshal(byteValue, &result)
if err != nil {
return err
}

// handle peers
nodes:= result["nodes"].([]interface{})
for _, node:= range node{
m := node.(map[string]interface{})
if name, exists := m["name"]; exists {
if name == "node1" {
m["location"] = "new-value1"
} else if name == "node2" {
m["location"] = "new-value2"
}
}
}

// Convert golang object back to byte
byteValue, err = json.Marshal(result)
if err != nil {
return err
}

// Write back to file
err = ioutil.WriteFile(outFile, byteValue, 0644)
return err } 这个地方主要用的是golang的interface{}数据类型,然后把interface{}转换成真正的数据类型。


这个函数可以扩充成动态的解析任何类型,只要把所有的类型全部定义成interface{},然后使用动态类型检测就可以知道每一个具体元素的类型了,最终达到类型jq的功能,访问和修改json文件。



var x interface{} = …



switch x.(type) {
case nil:
fmt.Println(“x is nil”)
case int:
fmt.Println(“x is int”)
case bool :
fmt.Println(“x is bool”)
case string:
fmt.Println(“x is string”)
case []interface{}:
fmt.Println(“x is slice”)
case map[string]interface{}:
fmt.Println(“x is map”)
default:
fmt.Println(“type unknown”)
}

}



Category golang