gpt4 book ai didi

json - 反序列化嵌套的 JSON,或者简单地在 Go 中传递它

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

使用 Go 构建基本 API,我将 JSON 存储在 postgres 表的 JSON 字段中,以及一些其他(普通)数据类型。使用我的模型,我只是尝试从数据库中获取一行并将其作为 JSON 向前传递。

使用 GORM为了将数据反序列化为结构,大部分映射都是无缝发生的,但 JSON 除外,它根据所选数据类型呈现为字节数组或字符串。

以下是模型(已更新):

type Item struct {
--snip--
Stats []ItemInfo `gorm:"column:stats" json:"stats" sql:"json"`
--snip--
}

type ItemInfo struct {
Stat string `json:"stat"`
Amount int `json:"amount"`
}

典型的 JSON 看起来像这样(来自数据库):

[{"stat": "Multistrike", "amount": 193}, {"stat": "Crit", "amount": 145}, 
{"stat": "Agility", "amount": 254}, {"stat": "Stamina", "amount": 381}]

所以我的想法是我只是想传递这些数据,而不是改变它,或者将它反序列化为 Go 结构或任何东西。 Controller /路由如下:

func GetItem(c *gin.Context) {
id, err := strconv.Atoi(c.Param("id"))

// Convert Parameter to int, for db query
if err != nil {
panic(err)
}

// Get the DB context
db, ok := c.MustGet("databaseConnection").(gorm.DB)
if !ok {
// Do something
}

// Hold the structified item here.
var returnedItem models.Item

// Get the db row
db.Where(&models.Item{ItemID: id}).First(&returnedItem)

if c.Bind(&returnedItem) == nil {

// Respond with the struct as json
c.JSON(http.StatusOK, returnedItem)
}
}

使用以下 JSON 进行响应(统计信息为 json.RawMessage):

{

"context": "raid-finder",
"stats": "W3sic3RhdCI6ICJWZXJzYXRpbGl0eSIsICJhbW91bnQiOiA0NX0sIHsic3RhdCI6ICJDcml0IiwgImFtb3VudCI6IDEwMH0sIHsic3RhdCI6ICJBZ2lsaXR5IiwgImFtb3VudCI6IDEwOX0sIHsic3RhdCI6ICJTdGFtaW5hIiwgImFtb3VudCI6IDE2M31d",
}

或者(将统计数据作为字符串):

{
"context": "raid-finder",
"stats": "[{\"stat\": \"Versatility\", \"amount\": 45}, {\"stat\": \"Crit\", \"amount\": 100}, {\"stat\": \"Agility\", \"amount\": 109}, {\"stat\": \"Stamina\", \"amount\": 163}]",
}

我有什么选项可以简单地传递它,到目前为止,我没有成功地尝试将 JSON 映射到结构(由于动态数据,这变得困难,以及我选择 JSON 作为开始的原因)?

我意识到 gin-gonic 发生了一些魔法,使用 c.JSON 自动(?)将结构中的所有数据编码为 JSON,但希望有某种方法可以避免编码 json 数据?

当使用 ItemInfo 子结构运行时,它会出现以下错误:

2016/01/07 08:21:08 Panic recovery -> reflect.Set: value of type []uint8 is not assignable to type []models.ItemInfo
/usr/local/go/src/runtime/panic.go:423 (0x42a929)
gopanic: reflectcall(nil, unsafe.Pointer(d.fn), deferArgs(d), uint32(d.siz), uint32(d.siz))
/usr/local/go/src/reflect/value.go:2158 (0x5492ce)
Value.assignTo: panic(context + ": value of type " + v.typ.String() + " is not assignable to type " + dst.String())
/usr/local/go/src/reflect/value.go:1327 (0x546195)

编辑:更新代码:

最佳答案

创建一个子结构,如 itemInfo 或类似的东西:

type itemInfo struct {
Stat string `json:"stat"`
Crit int `json:"crit"`
}

然后在你的 Item 结构中 make

type Item struct {
--snip--
Context string `gorm:"column:context" json:"context"`
Stats []itemInfo `gorm:"column:stats" json:"stats" sql:"json"`
--snip--
}

然后当你解码时它应该进入项目信息!

此外,我假设您使用的是暴雪 API,我已经制作了一个包装器,您可以在这里查看它:https://github.com/Gacnt/Go-WoW-API看看我是怎么做到的,但它完全没有完成我只实现了我在做某事时需要的部分。

关于json - 反序列化嵌套的 JSON,或者简单地在 Go 中传递它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34619613/

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