国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 常熟市| 洪湖市| 芮城县| 黑水县| 福贡县| 津南区| 广宗县| 阜平县| 赤壁市| 恩平市| 贵港市| 赣榆县| 米脂县| 庆安县| 西昌市| 怀仁县| 深圳市| 曲松县| 包头市| 天津市| 闸北区| 澎湖县| 宜丰县| 凤凰县| 岳西县| 桐柏县| 镇沅| 那曲县| 杭锦后旗| 灵台县| 新宁县| 西盟| 项城市| 宾川县| 三河市| 大丰市| 娱乐| 成都市| 十堰市| 澄江县| 德安县|