基本規則
核心功能
單元測試
參考資料
將乙個物件寫成特定文字格式的字元流,稱為序列化。
json簡單的理解就是特殊格式的字串,被設計用來傳輸和儲存資料,和xml類似,但是在api和前後端分離資料互動更多是使用json,json不僅比xml簡單,傳輸中更節省文字。**中的ajax、後端api基本上是使用json編碼後的資料。
參考官方 encoding/json 包 marshal 函式,將結構資料格式化為 json 字元流
首先需要設定讀取後輸出的json格式
const
( jsontag =
"json"
jsonstart =
"" arraystart =
"[" arrayend =
"]" stringstartend =
`"` stringstartendscaped =
`` is =
`:` comma =
"," null =
"null"
empty =
" " booleantrue =
"true"
booleanfalse =
"false"
)
將從結構體讀取的結果儲存到marshal結構體中
type marshal struct
result *bytes.buffer
tags [
]string
}
通過下列函式完成json物件序列化的功能
func
(m *marshal)
getvalue
(value reflect.value)
(reflect.value, reflect.type,
error
)func
(m *marshal)
do(object reflect.value)
error
func
(m *marshal)
handlekey
(key reflect.value)
error
func
(m *marshal)
handlevalue
(object reflect.value)
error
func
(m *marshal)
handlemarshaljson
(object reflect.value)
(bool,[
]byte
,error
)func
(m *marshal)
loadtag
(typ reflect.structfield)
(exists bool
, tag string
, err error
)func
(m *marshal)
encodestring
(str string
)string
最後匯出jsonmarshal介面
func
(m *marshal)
execute()
([]byte
,error
)func
jsonmarshal
(object inte***ce
, tags ...
string)(
byte
,error
)
為了驗證jsonmarshal json物件序列化的準確性,我們設定了兩個單元測試
func
testmarshal1
(t *testing.t)
},"numbers":[1,2,3],"others":},"c":}},"addresses":[},}]}`
addr :=
&address,}
example := person
, others:
map[
string
]*address
, addresses:
*address,}
// with tags "db" and "db.write"
// marshal
bytes, err :=
jsonmarshal
(example,
"db"
,"db.write"
)if err !=
nil res :=
string
(bytes)
if res != expected
}
func
testmarshal2
(t *testing.t)
},"numbers":[1,2,3],"others":},"c":}},"addresses":[},}]}`
addr :=
&address,}
example := person
, others:
map[
string
]*address
, addresses:
*address,}
// with tags "db" and "db.read"
// marshal
bytes2, err :=
jsonmarshal
(example,
"db"
,"db.read"
)if err !=
nil res :=
string
(bytes2)
if res != expected
}
執行測試結果如下
程式包開發-json格式序列化
encoding/json
Go語言的學習之旅 五
func main 陣列 printslice s fmt.println s 0 2 使用切片方式 fmt.println s 2 fmt.println s 0 fmt.println s s2 make int,3,5 通過make int,len,cap 來定義切片 printslice s...
Android socket 開發之旅
這段時間以來,由於乙個專案,輾轉於android的socket 程式設計,倍加煩惱。特編寫寫此文以記.1 socket原理 2 兩種連線方式的區別 3 tcp簡單socket通訊 4 與gps伺服器的socket通訊 2 android socket程式設計分為tcp與udp兩種建立連線的方式。一 ...
Android Kotlin 開發之旅
kotlin語言推出已經兩年之久了,作為一種火熱的全棧開發語言,本人卻一直沒有正式在專案中使用,最近專案重構中需要使用kotlin語言,這篇部落格也作為乙個學習筆記。在專案的bulid.gradle 中配置 buildscript dependencies kotlin 支援擴充套件,使用kotli...