动态地返回不同类型的JSON结构?

时间:2016-04-11 16:03:31

标签: json go

我和Go一起玩,并且无法适应我的一些继承"设计从其他语言到其结构。我在OCaml和其他一些具有相似结构的语言中编码,但我很困惑。没有类型继承,使用共享结构从不同的地方返回JSON会变得有点奇怪。

我必须根据需要通过输入数据递归递归来构建一个单独的JSON对象来响应。

以例如:

{
    "appVersion": "1.0.0",
    "messageStatus": "received"
}

......和:

{
    "appVersion": "1.0.0",
    "uploadStatus": "received"
}

到目前为止,我能在Go中找到这项工作的唯一方法是复制并粘贴包含" appVersion"分别进入两个输出生成函数,但我不想这样做,因为我不想两次维护相同的代码集。

我在这里试图解决这个问题:

type JSONResponse struct {
    appVersion string
}
type MessageJSONResponse struct {
    JSONResponse
    messageStatus string
}
type UploadJSONResponse struct {
    JSONResponse
    uploadStatus string
}

......然后:

type Message struct {
    formattingVersion *int

}

func NewMessageObject(r *http.Request) (bool, *MessageJSONResponse) {
    message := new(Message)

    if (true) {
        // #TODO: INSERT LOGIC HERE!
        *message.formattingVersion = 2;

    }

    if (message.formattingVersion != nil) {
        response := new(MessageJSONResponse)
        response.messageStatus = "OK"

        return false, errorResponse

    }

    return true, nil

}

......并且:

func init() {
    http.Handle("/endpoints/message", JSONResponseHandler(messageHandler))

}

func JSONResponseHandler(h func (w http.ResponseWriter, r *http.Request) interface {}) http.Handler {

// #TODO - convert `JSONResponse` into actual JSON or output JSON Error!

}

func messageHandler(w http.ResponseWriter, r *http.Request) JSONResponse { // #BROKEN TYPES?

    hasError, messageResponse := NewMessageObject(r)
    if (hasError || messageResponse==nil) { return nil } // #TODO
    ////

    // #TODO ... more message things.

    return messageResponse;

};

这种方法(对任何代码错误感到抱歉,非常漫长的一天,我上床睡觉)不起作用,因为为了传递各种各样的返回值...类型可以'改变等等。

JSONResponseHandler 包装器方法实际上适用于我的结束,但只有interface {}类型给出了类型的变化...所以我把它排除在外因为它会使代码混乱。但是,如果我在具有可选的带星号返回属性的后续块上使用interface {}(例如" NewMessageObject"),则JSON构造函数似乎忽略这些值,因为它们包含在空接口中而不是仅仅暴露为他们的原始类型。但是,他们必须有一个零选项......

出了什么问题?一般的设计? 我基本上是试图通过基于输入数据的后续调用来构建JSON对象响应(或返回带有JSON格式的错误)......以一种巧妙的抽象方式。

1 个答案:

答案 0 :(得分:1)

要解决你的json问题,你可以使用一个结构并用json标记每个字段:" omitempty":

package main

import (
    "encoding/json"
    "fmt"
)

type foostruct struct {
    Myfoo   string `json:"myfoo,omitempty"`
    Yourfoo string `json:"yourfoo,omitempty"`
    Ourfoo string `json:"ourfoo,omitempty"`
}

func main() {
    j := []byte("{\"myfoo\":\"mine\", \"yourfoo\":\"yours\"}")
    fstruct := &foostruct{}
    err := json.Unmarshal(j, fstruct)
    if err != nil {
        panic(err)
    }

    b, err := json.Marshal(fstruct)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(b))
}

您会看到输出中不包含字段" ourfoo":

{"myfoo":"mine","yourfoo":"yours"}

在这里试试: http://play.golang.org/p/zKwFaxbLJu