json 如何在golang中从一个从导入包接收的结构体中删除某些项?

mnowg1ta  于 2023-04-08  发布在  Go
关注(0)|答案(2)|浏览(244)

我正在从导入的第三方模块包中接收项目:
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,并循环通过它,或者编组和解组似乎涉及更多的过程,然后它只需要实现一些相对简单的东西。
编辑:结构体是一个切片([])。

rdlzhqv9

rdlzhqv91#

定义一个新的struct,它是你已有的struct的副本,使用不同的标签:

type ImportedStructMarshal struct {
    Ip                  net.IP                  `json:"ip"`
    Index               uint32                  `json:"index"`
    LocalIndex          uint32                  `json:"-"`
    RemoteIndex         []*udp.Addr             `json:"remoteIndex"`
    Certificates        *certificates           `json:"certificates"`
    VpnAddress          []iputil.VpnIp          `json:"vpnAddress"`
}

然后,使用这个新的结构体进行封送:

var input ImportedStruct
forMarshal:=ImportedStructMarshal(input)
...

只要新结构与导入的结构逐个字段兼容,这就可以工作。

nbnkbykc

nbnkbykc2#

如果你可以改变结构体,在json标签上加一个破折号。例如删除LocalIndex

type ImportedStruct struct {
    Ip                  net.IP                  `json:"ip"`
    Index               uint32                  `json:"index"`
    LocalIndex          uint32                  `json:"-"`
    RemoteIndex         []*udp.Addr             `json:"remoteIndex"`
    Certificates        *certificates           `json:"certificates"`
    VpnAddress          []iputil.VpnIp          `json:"vpnAddress"`
}

如果你不能改变结构体(第三方包),并且你对forking或其他东西不感兴趣,你将不得不制作你自己的结构体,其中包含或嵌入ImportedStruct。然后,在你的新结构体上实现json.Marshalerjson.Unmarshaler来做你需要它做的事情。

相关问题