回答

收藏

从结构中删除字段或将它们隐藏在 JSON 响应中

技术问答 技术问答 282 人阅读 | 0 人回复 | 2023-09-12

我在 Go 创建了一个 API,在调用时进行查询,创建结构实例,然后将结构编码为 JSON,然后发送回调用户。现在我希望调用者能通过输入字段。GET 参数选择他们想要返回的特定字段。! J$ R( I  G# Y% ~) g
这意味着我的结构会根据字段值改变。有没有办法从结构中删除字段?或者至少动态隐藏在 JSON 响应?(注意:有时候我有空值,所以 JSON omitEmpty 标签在这里不起作用)如果这些都不可能,有没有更好的方法来处理这个问题?
+ L6 S$ M/ r0 L8 u5 k* h+ B) n# q5 V我使用的结构的较小版本如下:# l6 {; ~+ h0 G% m% U8 d
    type SearchResult struct    Date        string      `json:"date"`    IdCompany   int         `json:"idCompany"`    Company     string      `json:"company"`    IdIndustry  interface{} `json:"idIndustry"`    Industry    string      `json:"industry"`    IdContinent interface{} `json:"idContinent"`    Continent   string      `json:"continent"`    IdCountry   interface{} `json:"idCountry"`    Country     string      `json:"country"`    IdState     interface{} `json:"idState"`    State       string      `json:"state"`    IdCity      interface{} `json:"idCity"`    City        string      `json:"city"`} //SearchResulttype SearchResults struct    NumberResults int            `json:"numberResults"`    Results       []SearchResult `json:"results"`} //type SearchResults, p7 n% ^- s- a2 X$ b% c
然后我这样编码输出响应:
# J% P/ I1 [3 \0 f0 E) ^9 [. O
    err := json.NewEncoder(c.ResponseWriter).Encode(&msg)
    . W* s# M( X8 \  z9 U" ?8 N# H
               
- K# N" a0 U# y% c    解决方案:                                                                , u1 m0 m+ V! X9 n+ ?+ x! z
                                                                问题是要求根据调用器提供的字段列表动态选择字段。使用静态定义 json 结构标记做不到这一点。
3 G- i' L7 T% r3 q如果你想要总是跳过一个字段到 json-encode,当然使用json:"-"忽略这个字段。(请注意,如果您的字段没有导出,则此不是必要;这些字段总是 json 忽略编码器。)这不是问题要问的。
, X* q. Y- d( ], D2 x) e引用对json:"-"答案评论:
! f+ X( [+ c# I  W3 a! ?这个 [json:"-" 是大多数人从搜索结果到这里想要的答案,但这不是问题的答案。& c% j( |; I7 o% o' ^
map[string]interface{}在这种情况下,我会使用 a而不是 struct 。您可以通过调用delete为了轻松删除字段,地图上的内置函数。
: @2 m% c; O+ m7 Q- e3 K也就是说,如果不能先查询要求的字段。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则