未知の構造jsonに対するGolangの解析

6627 ワード

Golangのjsonパケット解析は、プログラム内でJSONデータの読み取りと書き込みを容易にすることができます.
  • JSONシーンを生成するのは比較的簡単で、json.Marshal()は、入力された構造体に基づいてJSONデータを生成します.
  • 解析JSONはデータを構造体に解析するが,JSONフォーマットはその伝達パラメータの値に基づいてタイプを判断する可能性があるため,この自由組合せの特徴は汎用的なインタフェースタイプで解決する必要がある.本稿では,未知構造体データの解析に重点を置き,主に以下の1と2のステップに分けた.

  • 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{}構造タイプにより
  • に変換
    ここではメッセージの内容に基づいて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