部分序列化结构的最佳方法是什么?

时间:2019-01-06 08:00:12

标签: json api go serialization struct

我用过gorm库。

gorm支持将结构数据插入数据库并返回。

但是我的服务并不总是需要每个struct成员。

例如;

/ Address =>此api将仅返回用户地址。

但是orm返回所有struct成员。

像这样

    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代码。

告诉我有关此问题的最佳实践。

谢谢你

2 个答案:

答案 0 :(得分:3)

您可以使用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
}

在这种情况下,您需要具有两个结构,而不是一个,并且需要编写一个函数来转换一个结构或另一个结构,但是当您处理数据时,您将具有更大的灵活性,并且数据库层将与其余服务的连接较少层。

答案 1 :(得分:2)

我想您将响应序列化为JSON。 This解决了您的问题。为了始终跳过字段序列化,只需添加json:"-"

type User {
   Name string
   Address string `json:"-"`
}