代码之家  ›  专栏  ›  技术社区  ›  ma77c

golang |解组任意数据

  •  0
  • ma77c  · 技术社区  · 8 年前

    问题

    有没有一种方法可以将JSON数据分解成部分/节?

    假设数据的上半部分是一个“代码”,它将指示下半部分要做什么。。。例如,根据“代码”将下半部分解组到特定结构中。


    有两个结构可以作为下半部分发送。。。

    type Range Struct {
        Start int
        End   int
    
    }
    
    type User struct {
        ID    int
        Pass  int
    }
    

    伪代码示例

    它可能看起来像这样。。。

    message := &Message{
        Code: 4,
        &Range {
            Start: 1,
            End: 10,
        }
    }
    

    message := &Message{
        Code: 3,
        &User {
            ID: 1,
            Pass: 1234,
        }
    }
    

    所以,在解密这些数据时,我可以。。。

    // get code from top half
    m := Message{}
    err = json.UnMarshallTopHalf(byteArray, &m)
    if m.Code == 4 {
        // ok, the code was four, lets unmarshall into type Range
        r := Range{}
        json.UnmarshalBottomHalf(byteArray, &r)
    }
    

    我已经看过了 JSON & Go

    2 回复  |  直到 8 年前
        1
  •  1
  •   Uvelichitel    8 年前

    您可以在json中解组下半部分。首先是RawMessage,比如

    package main
    
    import (
        "encoding/json"
        "fmt"
    )
    
    type Message struct {
        Code    int
        Payload json.RawMessage // delay parsing until we know the code
    }
    type Range struct {
        Start int
        End   int
    }
    type User struct {
        ID   int
        Pass int
    }
    
    func MyUnmarshall(m []byte) {
        var message Message
        var payload interface{}
        json.Unmarshal(m, &message) // delay parsing until we know the color space
        switch message.Code {
        case 3:
            payload = new(User)
        case 4:
            payload = new(Range)
        }
        json.Unmarshal(message.Payload, payload) //err check ommited for readability
        fmt.Printf("\n%v%+v", message.Code, payload) //do something with data
    }
    
    func main() {
        json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`)
        MyUnmarshall(json)
        json = []byte(`{"Code": 3, "Payload": {"ID": 1, "Pass": 1234}}`)
        MyUnmarshall(json)
    }
    
        2
  •  1
  •   user4466350 user4466350    8 年前
    type Message struct  {
        Code int `json:"cc"`
        Range *Range `json:"vvv,omitempty"`
        User *User `json:"fff,omitempty"`
    }