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

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返回形状生成序列化程序代码

我用过戈姆图书馆

gorm支持在数据库中插入结构数据并返回

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

比如,

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

但是orm返回所有struct memeber

像这样

    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层之间的映射。