未知の構造jsonに対するGolangの解析
6627 ワード
Golangのjsonパケット解析は、プログラム内でJSONデータの読み取りと書き込みを容易にすることができます. JSONシーンを生成するのは比較的簡単で、json.Marshal()は、入力された構造体に基づいてJSONデータを生成します. 解析JSONはデータを構造体に解析するが,JSONフォーマットはその伝達パラメータの値に基づいてタイプを判断する可能性があるため,この自由組合せの特徴は汎用的なインタフェースタイプで解決する必要がある.本稿では,未知構造体データの解析に重点を置き,主に以下の1と2のステップに分けた.
1.未知の構造体をinterface{}タイプに解析する
2.指定した構造体にinterface{}タイプを変換
読者は、以下の2つの方法のいずれかを用いて転化を完了することができる.変換 は、シーケンス化および逆シーケンス化によって完了する.
ここで、未知の構造体Paramsを[]byte構造型データByteParamsに再シーケンスし、メッセージの内容に応じて対応する構造体型データに変換します. interface{}構造タイプにより に変換
ここではメッセージの内容に基づいてinterface{}を対応する構造体タイプデータに直接変換する.
最新のステータス新規参照このソース局リンク:https://turbock79.cn/?p=1905
1.未知の構造体をinterface{}タイプに解析する
// , json 。 interface{}
type MsgRequest struct {
TimeStamp uint64 `json:"timestamp"`
Object string `json:"object"`
Params interface{} `json:"params"`
}
// ,params json
var Msg MsgRequest
if err = json.Unmarshal(msg.Payload(), &Msg); err != nil {
log.Error(err)
}
2.指定した構造体にinterface{}タイプを変換
読者は、以下の2つの方法のいずれかを用いて転化を完了することができる.
ここで、未知の構造体Paramsを[]byte構造型データByteParamsに再シーケンスし、メッセージの内容に応じて対応する構造体型データに変換します.
//OBJ_Test1
type Test1_OBJ struct {
Id uint64 `json:"id"`
Name string `json:"string"`
}
ByteParams, _ := json.Marshal(Msg.Params)
switch {
case Obj == OBJ_Test1:
var test1 Test1_OBJ
if err = json.Unmarshal(ByteParams, &test1); err != nil {
log.Error(err)
}else {
//todo
}
case Obj == OBJ_Test2:
...
default:
}
}
ここではメッセージの内容に基づいてinterface{}を対応する構造体タイプデータに直接変換する.
//OBJ_Test1
type Test1_OBJ struct {
Id uint64 `json:"id"`
Name string `json:"string"`
}
switch {
case Obj == OBJ_Test1:
var test1 Test1_OBJ
if test1,ok := (Msg.Params).(Test1_OBJ); ok {
//todo
}else {
log.Error(err)
}
case Obj == OBJ_Test2:
...
default:
}
}
最新のステータス新規参照このソース局リンク:https://turbock79.cn/?p=1905