最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2018年10月03日 08:39:55   作者:CodingCode  
這篇文章主要介紹了golang如何修改json文件內(nèi)容的方法示例,使用一個(gè)例子說(shuō)明golang如何訪問(wèn)和修改json文件,有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

使用一個(gè)例子說(shuō)明golang如何訪問(wèn)和修改json文件;主要分三步:

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

假定用戶(hù)輸入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
}

這個(gè)地方主要用的是golang的interface{}數(shù)據(jù)類(lèi)型,然后把interface{}轉(zhuǎn)換成真正的數(shù)據(jù)類(lèi)型。

這個(gè)函數(shù)可以擴(kuò)充成動(dòng)態(tài)的解析任何類(lèi)型,只要把所有的類(lèi)型全部定義成interface{},然后使用動(dòng)態(tài)類(lèi)型檢測(cè)就可以知道每一個(gè)具體元素的類(lèi)型了,最終達(dá)到類(lèi)型jq的功能,訪問(wèn)和修改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ù)說(shuō)json-iteator 是目前golang中對(duì)json格式數(shù)據(jù)處理最快的包(比官方j(luò)son包快6倍),好像是滴滴團(tuán)隊(duì)開(kāi)源的,使用起來(lái)也非常方便,有興趣的可以學(xué)習(xí)學(xué)習(xí),下面我們看看官方的示例代碼,使用起來(lái)也是很方便

package main

import "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)
}

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 如何通過(guò)go自定義一個(gè)分頁(yè)插件

    如何通過(guò)go自定義一個(gè)分頁(yè)插件

    分頁(yè)是我們?nèi)粘i_(kāi)發(fā)中經(jīng)常會(huì)遇到的一個(gè)需求,下面這篇文章主要給大家介紹了關(guān)于如何通過(guò)go自定義一個(gè)分頁(yè)插件的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • 如何在golang中檢查文件是否存在

    如何在golang中檢查文件是否存在

    如果你用的是?Python,可通過(guò)?os.path.exists?這樣的標(biāo)準(zhǔn)庫(kù)函數(shù)實(shí)現(xiàn),遺憾的是,Go?標(biāo)準(zhǔn)庫(kù)沒(méi)有提供這樣直接的函數(shù),所以下面我們就來(lái)了解下如何使用GO語(yǔ)言能實(shí)現(xiàn)檢查文件是否存在呢
    2024-02-02
  • Goland?Gin?框架中的表單處理與數(shù)據(jù)綁定的操作方法

    Goland?Gin?框架中的表單處理與數(shù)據(jù)綁定的操作方法

    本文詳細(xì)介紹了Gin框架中表單處理的功能,包括數(shù)據(jù)綁定、驗(yàn)證和文件上傳等,并通過(guò)一個(gè)完整的用戶(hù)注冊(cè)項(xiàng)目示例展示了實(shí)際應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Go 函數(shù)返回nil遇到問(wèn)題避坑分析

    Go 函數(shù)返回nil遇到問(wèn)題避坑分析

    這篇文章主要為大家介紹了Go 函數(shù)返回nil遇到的避坑問(wèn)題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Go?channel實(shí)現(xiàn)批量讀取數(shù)據(jù)

    Go?channel實(shí)現(xiàn)批量讀取數(shù)據(jù)

    Go中的?channel?其實(shí)并沒(méi)有提供批量讀取數(shù)據(jù)的方法,需要我們自己實(shí)現(xiàn)一個(gè),使用本文就來(lái)為大家大家介紹一下如何通過(guò)Go?channel實(shí)現(xiàn)批量讀取數(shù)據(jù)吧
    2023-12-12
  • Go語(yǔ)言kube-scheduler深度剖析與開(kāi)發(fā)之pod調(diào)度

    Go語(yǔ)言kube-scheduler深度剖析與開(kāi)發(fā)之pod調(diào)度

    這篇文章主要為大家介紹了Go語(yǔ)言kube-scheduler深度剖析與開(kāi)發(fā),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • golang生成JSON以及解析JSON

    golang生成JSON以及解析JSON

    這篇文章主要介紹了golang生成JSON以及解析JSON,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Go語(yǔ)言中defer語(yǔ)句的用法

    Go語(yǔ)言中defer語(yǔ)句的用法

    這篇文章介紹了Go語(yǔ)言中defer語(yǔ)句的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • GoFrame?gmap遍歷hashmap?listmap?treemap使用技巧

    GoFrame?gmap遍歷hashmap?listmap?treemap使用技巧

    這篇文章主要為大家介紹了GoFrame?gmap遍歷hashmap?listmap?treemap使用技巧的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go開(kāi)源Hugo站點(diǎn)渲染之模板詞法解析

    go開(kāi)源Hugo站點(diǎn)渲染之模板詞法解析

    這篇文章主要為大家介紹了go開(kāi)源Hugo站點(diǎn)渲染之模板詞法解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評(píng)論

泊头市| 项城市| 准格尔旗| 汨罗市| 肇庆市| 汕头市| 平顶山市| 门头沟区| 揭西县| 清远市| 石家庄市| 新干县| 威信县| 新和县| 高州市| 富平县| 黔江区| 云南省| 营山县| 滕州市| 九江县| 樟树市| 赤城县| 岚皋县| 同心县| 浦北县| 凌海市| 武胜县| 徐闻县| 泽普县| 义马市| 锦州市| 新邵县| 中江县| 乌兰察布市| 莱西市| 青海省| 刚察县| 勃利县| 汝城县| 溆浦县|