国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

golang如何修改json文件內(nèi)容的方法示例

2020-04-01 18:52:53
字體:
供稿:網(wǎng)友

使用一個例子說明golang如何訪問和修改json文件;主要分三步:

  1. 從文件讀入json串
  2. 把json串轉(zhuǎn)變成golang對象
  3. 遍歷或者修改json值
  4. 寫回文件

假定用戶輸入json串為:

{ "user": {  "mspid": "admin",  "email": "admin@domain.com" },  "nodes": [  {     "name": "node1",   "location": "node1.domain.com:8080"  },   {     "name": "node2",   "location": "node2.domain.com:8080"  }   ]}

我們的目標(biāo)是把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{}數(shù)據(jù)類型,然后把interface{}轉(zhuǎn)換成真正的數(shù)據(jù)類型。

這個函數(shù)可以擴充成動態(tài)的解析任何類型,只要把所有的類型全部定義成interface{},然后使用動態(tài)類型檢測就可以知道每一個具體元素的類型了,最終達到類型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")  }  }

PS:據(jù)說json-iteator 是目前golang中對json格式數(shù)據(jù)處理最快的包(比官方j(luò)son包快6倍),好像是滴滴團隊開源的,使用起來也非常方便,有興趣的可以學(xué)習(xí)學(xué)習(xí),下面我們看看官方的示例代碼,使用起來也是很方便

package mainimport "github.com/json-iterator/go"type User struct {  Name string  Age int8}func main() {  user := User{      Name: "tanggu",      Age: 18,    }    var jsoniter = jsoniter.ConfigCompatibleWithStandardLibrary    // 序列化    data, err := jsoniter.Marshal(&user)    if err != nil {      log.Fatal(err)    }    fmt.Println(string(data))    // 反序列化    var people User    err = jsoniter.Unmarshal(data, &people)    if err != nil {      log.Fatal(err)    }    fmt.Println(people)}

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 得荣县| 白水县| 大荔县| 鄂伦春自治旗| 依安县| 教育| 高尔夫| 红桥区| 成安县| 揭西县| 新泰市| 宝清县| 肇东市| 谢通门县| 永宁县| 博乐市| 深泽县| 克山县| 云浮市| 保康县| 玛纳斯县| 夏津县| 济南市| 台中县| 泽州县| 平度市| 额敏县| 苗栗市| 额尔古纳市| 定西市| 玛沁县| 黄大仙区| 乃东县| 玉门市| 洪雅县| 万山特区| 德州市| 禹城市| 阳谷县| 南和县| 金昌市|