1. 程式人生 > >Golang struct結構體內部的反引號該如何定義欄位編碼生成json字串的寫法

Golang struct結構體內部的反引號該如何定義欄位編碼生成json字串的寫法

package main

import (
    "encoding/json"
    "fmt"
)

//父物件
type Human struct {
    Name   string  `json:"english_name"` //把struct編碼成json字串時,Name欄位的key是english_name,而不是Name
    Age    int     `json:"-"`            //把struct編碼成json字串時,會忽略Age這個欄位
    Weight float64 //`json:",string"` //編碼成字串,這個string選項只適用字串,浮點型和整型資料
}

//子物件
type Student struct {
    Human
    Speciality string
    Hobby      []string
    Score      float64 `json:"total,omitempty"` //如果這個欄位是空值,則不編碼到JSON裡面,否則用total為名字編碼
    Secret     []byte  `json:",omitempty"`      //如果這個欄位是空值,則不編碼到JSON裡面,否則用Secret為名字編碼
    //是一個經過base64編碼的字串
}

func main() {
    json1Str := `[
    {"Name": "James", "Age": 22,"Weight":65.80},
    {"english_name": "Jack", "Age": 27,"Weight":78.50},
    {"Name": "Kite", "Age": 19,"Weight":61.40}]`
    //定義一個切片物件
    var humans []Human
    //json字串轉換成物件格式
    err1 := json.Unmarshal([]byte(json1Str), &humans)
    if err1 != nil {
        fmt.Println(err1)
    }
    fmt.Println("json字串轉換成物件格式")
    fmt.Println(humans)

    fmt.Println("物件集合轉換成json字串")
    //切片初始化3個物件
    slice1 := []Human{
        Human{Name: "James", Age: 22, Weight: 65.80},
        Human{Name: "Jack", Age: 27, Weight: 78.50},
        Human{Name: "Kite", Age: 19, Weight: 61.40}}
    //物件集合轉換成json字串
    data1, err2 := json.Marshal(slice1)
    if err2 != nil {
        fmt.Println(err2)
    }
    fmt.Println(string(data1))
    fmt.Println("=======================================================================================")

    stus := make([]Student, 0)
    jason := Student{
        Human: Human{
            Name:   "jason",
            Age:    28,
            Weight: 60.30},
        Speciality: "computer science",
        Hobby:      []string{"tennis", "swimming", "reading"},
        Score:      725.5,
        Secret:     []byte{'I', 20, 'L', 'o', 'v', 'e', 20, 'Y', 'o', 'u', '!'}}
    stus = append(stus, jason)
    fmt.Println(stus, "\n\r")
    //物件集合轉換成json字串
    data2, err3 := json.Marshal(stus[0])
    if err3 != nil {
        fmt.Println(err3)
    }
    fmt.Println(string(data2))

    fmt.Println("=======================================================================================")
    json2Str := `[
    {"english_name":"jason","Weight":60.3,"Speciality":"computer science","Hobby":["tennis","swimming","reading"],"total":725.5,"Secret":"SRRMb3ZlFFlvdSE="}]`
    //定義一個切片物件
    var stuss []Student
    //json字串轉換成物件格式
    err4 := json.Unmarshal([]byte(json2Str), &stuss)
    if err4 != nil {
        fmt.Println(err4)
    }
    fmt.Println("json字串轉換成物件格式")
    fmt.Println(stuss)

}

範例 如何獲得一個這樣的json格式的資料{"code":200,"msg":"ok","data":{"content":"test"}}

package main

import (
    "encoding/json"
    "fmt"
)

type Header struct {
    Code int    `json:"code"`
    Msg  string `json:"msg"`
    Data `json:"data"`
}

type Data struct {
    Content string `json:"content"`
}

func main() {
    in := Header{Code: 200, Msg: "ok", Data: Data{Content: "test"}}
    out, _ := json.Marshal(&in)
    json := string(out)
    fmt.Println(json)
}

{"asks":[[1671.7000,24.4247],[1671.8000,1.2068],[1672.0000,2.0000]]} 請問這樣的Json,對應的資料結構要怎麼定義?

使用Map實現獲得同樣的結果實現:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    data := make(map[string][][]float64)
    // data["asks"] = [][]float64{[]float64{1671.7000, 24.4247}, []float64{1671.8000, 1.2068}, []float64{1672.0000, 2.0000}}
    data["asks"] = [][]float64{{1671.7000, 24.4247}, {1671.8000, 1.2068}, {1672.0000, 2.0000}} // 簡寫格式


    out, _ := json.Marshal(data)
    json := string(out)
    fmt.Println(json)
}

除錯控制檯列印輸出如下資訊:

2017/07/10 11:27:44 server.go:73: Using API v1
2017/07/10 11:27:44 debugger.go:97: launching process with args: [/root/code/go/src/contoso.org/Gooo/debug www.baidu.com www.ifeng.com www.sina.com.cn www.qq.com www.taobao.com www.suning.com www.163.com www.iqiyi.com sports.cntv.cn www.jd.com]
API server listening at: 127.0.0.1:2345
2017/07/10 11:27:45 debugger.go:505: continuing
{"asks":[[1671.7,24.4247],[1671.8,1.2068],[1672,2]]}

相關推薦

Golang struct結構體內引號如何定義編碼生成json字串寫法

package main import (     "encoding/json"     "fmt" ) //父物件 type Human struct {     Name   string  `json:"english_name"` //把struct編碼成json字

C++/C 千萬別對結構體內含有類使用memset賦值!!

因為一個crash,我琢磨了1天,無論如何修改,都不成功,無限次的懷疑都沒懷疑這個memset!!最後怒了,把memset對結構體賦值,換成了{},我TM成功了!後來百度搜索了,有一文說 memset可能破壞類的解構函式!!!血的教訓

void型別的指標指向結構體,如何用->引用結構體內元素

C語言允許void(泛型指標)等於其他任何型別的指標,但是當:void*p = struct str *p1;(即令void型別的指標等於結構體型別的指標)用p->使用內部元素的時候,編譯器在編譯的時候會報錯解決辦法:重新定義結構體指標變數進行強制型別轉換舉例:  1

感受下函式指標(指標函式)和結構體內函式

函式指標是指向函式的指標,指標函式是函式返回指標型別//函式指標 #include<stdio.h> int fun(int a) { return a*a; } int dy(int (*f)(int x),int a) { return f(a);

golang struct結構體方法中的引數需要定義為指標型別

前幾日寫一個網頁的簡單計數器問題時發現,計數器居然永遠為0,計數器不計數,見鬼了。。。 程式碼如下: type Counter struct { n int } func (ctr Counter) ServeHTTP(c http.ResponseWriter, r

C語言結構體宣告的妙用,隱藏結構體內資訊

測試環境: vs2008 1. 前言 C語言是一個比較底層的語言,似乎沒有c++,java高階語言中對成員變數的保護,例如加上private修飾。但其實C語言也可以通過結構體的宣告達到型別的效果。 具體的做法是在一個頭檔案裡定義一個結構,另外一個C檔案實現,操作這個結構的函

C語言中結構體內成員的對齊

說明: ******不同的編譯器和處理器,其結構體內部的成員有不同的對齊方式。 ******使用sizeof()運算子計算結構體的長度。 ###結構體中每個成員相對於結構首地址的偏移量都是成員大小的整數倍,如果有需要編譯器會在成員之間加上填充字。 ###結構體的總大小是結構

C語言結構體內含有陣列,結構體作為引數傳遞時需用指標,否則對陣列的修改不會被記錄

    在C語言程式設計時,常常會定義結構體,而且結構體裡面常常會有陣列,比如如下所示: typedef struct {int data[MAX_HEAP_SIZE];unsigned int heap_size;}HeapType;     這是一個堆的資料結構,包含堆

Jackson序列化和序列化忽略

一、設定Jackson序列化時只包含不為空的欄位 new ObjectMapper().setSerializationInclusion(Include.NON_NULL); 二、設定在反序列化時忽略在JSON字串中存在,而在Java中不存在的屬性 new ObjectM

模糊查詢出兩個均含有模糊的列表

問題描述:前端輸入某個字元,若A欄位包含該字元,查詢出包含A欄位的所有資料,B欄位若也包含該字元,也要查詢出包含B欄位的所有資料,最終結果是兩組資料的並集解決方法:在sql中做如下操作:select * from tableName where 1=1 <if test

Struct不能直接在結構體內賦值,要呼叫建構函式

今天在寫同構圖題目的時候一直在WA,不知道錯在哪裡,最後問了下學弟結構體賦值的事情,才明白自己哪裡錯了 #include<bits/stdc++.h> using namespace std; const int maxN = 10005; int N, M, n, m, root[

Golangstruct結構標籤(Tag)的使用

Golang中struct結構標籤(Tag)的使用   在看別人的一些程式碼時,宣告結構時有個json:name是做什麼用的? 想知道原因得了解下: 在golang中,命名都是推薦都是用駝峰方式,並且在首字母大小寫有特殊的語法含義:包外無法引用。但是由經常需要和其它

golanggolang中的雙引號、單引號引號

[golang]golang中的雙引號、單引號、反引號 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/kturing/article/details/79844437 go語言中不傾向使用單引號表示字串,單引號用於表示Golang的

Go語言中struct內部的引號

type Account struct { // 把struct編碼成json字串時,common.Address欄位的key是address Address common.Address `json:"address"` // Ethereum accou

(轉)mysql創建表時引號的作用

navi _id sta gbk ble 擴展 engine bsp div 試用navicat工具查看現網mysql建表語句時,發現表名和字段名都是反引號引起來的 CREATE TABLE `tab_notice_title_tv` ( `i_id` int(11

golang struct轉map

link data eof ref for pac cpp main ring struct轉map package main import ( "fmt" "reflect" "time" ) type User struct { Id in

STL 結構體內重載 一個比較運算符

結構體 結構 body 比較 struct con clas class pos struct node { ll a, b; bool operator< (const node &c)const{ return

ES6--引號的標簽使用

con bin document pos time post rim 我們 支持 1 /*動態初始退出登出框話模態框*/ 2 /*動態的初始化退出登陸模態框 反引號ES6語法 3 * 為什麽在使用字符串格式直接創建模態框 4 * 1.不能在html頁面中

struct結構體指定初始化項目

錯位 發生 頻繁 常見 語法 float 其中 標準 硬件 標準C的標記化結構初始化語法在標準C中(C89)結構標準初始化是用{}來實始化,在C99的版本,采用了采用可讀性更強的標記化實始化,這在LINUX內核和驅動很為常見。這是ISOC99的用法CPrimer P

linux中單引號、 雙引號引號的區別

單引號、 雙引號反引號的區別1、單引號、雙引號用於用戶把帶有空格的字符串賦值給變量的分界符。  [root@localhost sh]# str="Today is Monday"  [root@localhost sh]# echo $str  Today is Monday  如果沒有