Json 部分序列化结构的最佳方式是什么?
我用过戈姆图书馆 gorm支持在数据库中插入结构数据并返回 但我的服务并不总是需要每个struct成员 比如, /Address=>此api将仅返回用户地址 但是orm返回所有struct memeber 像这样Json 部分序列化结构的最佳方式是什么?,json,api,go,serialization,struct,Json,Api,Go,Serialization,Struct,我用过戈姆图书馆 gorm支持在数据库中插入结构数据并返回 但我的服务并不总是需要每个struct成员 比如, /Address=>此api将仅返回用户地址 但是orm返回所有struct memeber 像这样 type User { Name string Address string } db.find(&user) apiResponse(200,user) 所以我总是为特定的api返回形状生成序列化程序代码
type User {
Name string
Address string
}
db.find(&user)
apiResponse(200,user)
所以我总是为特定的api返回形状生成序列化程序代码
type Serializer {
Address string
}
func MakeSerializer(User u) Serializer {
return Serilizer { Address: u.Address }
}
但上面的代码并不好
因为大多数Api返回形状都不同。所以我需要大量的serilzer代码
向我展示这个问题的最佳实践
谢谢我想您应该将您的响应序列化为JSON。解决你的问题。为了始终跳过字段序列化,只需添加json:-
我想您应该将响应序列化到JSON中。解决你的问题。为了始终跳过字段序列化,只需添加json:- 您可以使用json:-标记从结构的json序列化中删除字段,但我更喜欢为数据库层和rest接口使用不同的结构 大概是这样的:
type Construction struct {
gorm.Model
Name string `gorm:"size:30;unique_index"`
Description string `gorm:"size:100"`
}
type Construction struct {
Id uint `json:"Id"`
Name string `json:"Name"`
Description string `json:"Description"`
Additions string `json:"Additions"`
}
func setConstructionFields(ct types.Construction, construction *models.Construction, additions string) types.Construction {
ct.Name = construction.Name
ct.Description = construction.Description
ct.Additions = additions
return ct
}
在这种情况下,您需要有两个结构,而不是一个,并且您需要编写一个函数来将一个结构转换为另一个结构,但在处理数据时,您有了更大的灵活性,并且您的数据库层将更少地连接到rest服务层。您可以使用json:-tag从结构的json序列化中删除字段,但是我更喜欢为数据库层和rest接口使用不同的结构
大概是这样的:
type Construction struct {
gorm.Model
Name string `gorm:"size:30;unique_index"`
Description string `gorm:"size:100"`
}
type Construction struct {
Id uint `json:"Id"`
Name string `json:"Name"`
Description string `json:"Description"`
Additions string `json:"Additions"`
}
func setConstructionFields(ct types.Construction, construction *models.Construction, additions string) types.Construction {
ct.Name = construction.Name
ct.Description = construction.Description
ct.Additions = additions
return ct
}
在这种情况下,您需要有两个结构,而不是一个,并且您需要编写一个函数来将一个结构转换为另一个结构,但在处理数据时,您有了更大的灵活性,并且您的数据库层与rest服务层的连接将更少。db.find&user;apiResponse200和用户地址?db。查找和使用;表示在用户表和apiResponse200中获取db数据,&user.Address是api返回。只需简单地表达.db.find&user;apiResponse200和用户地址?db。查找和使用;表示在用户表和apiResponse200中获取db数据,&user.Address是api返回。只是简单的表达。谢谢你的回答!在您的代码中,api响应数据不仅仅是数据库获取数据。但我的代码情况正好相反。然后我使用json——类似于:type User{Name string Address string json:-}对吗?这只是一个例子。您的models.Construction可以有其他字段,同时可以跳过其中的一些字段。此外,您可以拥有完全不同的字段集。这是一个总的想法:您可以更改REST接口和所有需要更改的内容-这个函数设置REST和DB层之间的映射。谢谢您的回答!在您的代码中,api响应数据不仅仅是数据库获取数据。但我的代码情况正好相反。然后我使用json——类似于:type User{Name string Address string json:-}对吗?这只是一个例子。您的models.Construction可以有其他字段,同时可以跳过其中的一些字段。此外,您可以拥有完全不同的字段集。这是一个总的想法:您可以更改REST接口和所有需要更改的内容—这个函数设置REST和DB层之间的映射。