【问题标题】:What is the best way to partially serialize a structure?部分序列化结构的最佳方法是什么?
【发布时间】:2019-06-01 06:00:17
【问题描述】:

我使用了 gorm 库。

gorm 支持 struct 数据插入 DB 并返回。

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

例如;

/Address => 这个 api 将只返回用户地址。

但是 orm 返回所有结构体成员。

像这样。

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

告诉我这个问题的最佳实践。

谢谢你

【问题讨论】:

  • db.find(&user); apiResponse(200,&user.Address)?
  • 分贝。查找(&用户);意思是在用户表中获取数据库数据,而 apiResponse(200,&user.Address) 是 api 返回。只是简单的表达。

标签: json api go serialization struct


【解决方案1】:

您可以使用json:"-" 标记从结构的 JSON 序列化中删除字段,但我更喜欢对数据库层和休息接口使用不同的结构。

类似这样的:

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
}

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

【讨论】:

  • 感谢您的回答!在您的代码案例中,api 响应数据不仅仅是数据库获取数据。但我的代码案例,相反的情况。比我使用json "-"
  • 类似:输入用户{名称字符串地址字符串json:"-"}对吗?
  • 这只是一个例子。您的models.Construction 可以有其他字段,同时可以跳过其中一些。此外,您可以拥有完全不同的字段集。总体思路:您可以更改 REST 接口以及您需要更改的所有内容 - 此功能设置 REST 和 DB 层之间的映射。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多