gpt4 book ai didi

go - 根据json中的某个字段解析http json请求

转载 作者:数据小太阳 更新时间:2023-10-29 03:14:03 27 4
gpt4 key购买 nike

我想使用 encoding/json 中的 Decode() 函数解码 POST 请求的传入 JSON 负载

但是,我有一个情况,即同一 http 请求的 JSON 正文可能不同。我想根据嵌入在 JSON 中的字段来区分此正文。我如何在 Go 中提取这个奇异字段?例如,我想要以下逻辑-

type BaseObj struct {
Version string
}

type v1Object struct {
BaseObj
Name string
}

type v2Object struct {
BaseObj
Name string
Address string
}

// Somehow extract the 'version' from JSON (req.Body)
if version == "v1" {
var data v1Object
json.NewDecoder(req.Body).Decode(&data)
} else {
var data v2Object
json.NewDecoder(req.Body).Decode(&data)
}

如何在正文中嵌入“版本”字段?

感谢您的帮助!

最佳答案

有两种方法可以解决这个问题:

方案一:核心库方式

通过只使用核心库,你可以这样做:

import (
"bytes"
"ioutil"
"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {

// read body content first to reuse
type protoData struct {
Version string `json:"version"`
}
proto := protoData{}
content, err := ioutil.ReadAll(req.Body)
json.NewDecoder(bytes.NewBuffer(content)).Decode(&proto)

// version switch
if proto.Version == "v1" {
var data v1Object
json.NewDecoder(bytes.NewBuffer(content)).Decode(&data)
// ... do something with data
} else {
var data v2Object
json.NewDecoder(bytes.NewBuffer(content)).Decode(&data)
// ... do something with data
}

}

方案二:lzjson方式

我写了一个愚蠢的库,lzjson , 使代码更简洁。

import (
"net/http"

"github/go-restit/lzjson"
)

func handler(w http.ResponseWriter, r *http.Request) {
jsonBody := lzjson.Decode(r.Body)
version := jsonBody.Get("version").String()
if version == "v1" {
var data v1Object
jsonBody.Unmarshal(&data)
// ... do something with data
} else {
var data v2Object
jsonBody.Unmarshal(&data)
// ... do something with data
}
}

关于go - 根据json中的某个字段解析http json请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42171765/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com