我正在从导入的第三方模块包中接收项目:myItem := importedPackage.get()
它是一个类似这样的结构:
type ImportedStruct struct {
Ip net.IP `json:"ip"`
Index uint32 `json:"index"`
LocalIndex uint32 `json:"localIndex"`
RemoteIndex []*udp.Addr `json:"remoteIndex"`
Certificates *certificates `json:"certificates"`
VpnAddress []iputil.VpnIp `json:"vpnAddress"`
}
我想删除一个或多个项目,然后从我的Golang Gin API返回JSON:c.JSON(200, &myItem)
问题是试图找到最有效的资源方式来做到这一点。
我已经考虑了一个循环,并将我需要的字段写入一个新的结构:
newItem := make([]ImportedStruct, len(myItem))
i := 0
for _, v := range myItem {
newItem[i] = ...
...
}
c.JSON(200, &hostList)
我还考虑了编组,然后解编组,将其分配给另一个结构体,然后通过API返回:
// Marshal the host map to json
marshaledJson, err := json.Marshal(newItem)
if err != nil {
log.Error(err)
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
// Unmarshal the json into structs
var unmarshalledJson []ImportedStruct
err = json.Unmarshal(marshaledJson, &unmarshalledJson)
if err != nil {
log.Error(err)
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
// Return the modified host map
c.JSON(200, &unmarshalledJson)
我希望能找到一种更有效的方法来做到这一点。myItem
可能包含超过300万行JSON,并循环通过它,或者编组和解组似乎涉及更多的过程,然后它只需要实现一些相对简单的东西。
编辑:结构体是一个切片([])。
2条答案
按热度按时间rdlzhqv91#
定义一个新的struct,它是你已有的struct的副本,使用不同的标签:
然后,使用这个新的结构体进行封送:
只要新结构与导入的结构逐个字段兼容,这就可以工作。
nbnkbykc2#
如果你可以改变结构体,在json标签上加一个破折号。例如删除
LocalIndex
:如果你不能改变结构体(第三方包),并且你对forking或其他东西不感兴趣,你将不得不制作你自己的结构体,其中包含或嵌入
ImportedStruct
。然后,在你的新结构体上实现json.Marshaler
和json.Unmarshaler
来做你需要它做的事情。