是否可以忽略MarshalJSON結構的自定義實作,而只使用標準編組函式?
該結構很復雜,并且有很多嵌套結構,所有這些都使用 custom MarshalJSON,我想忽略它們。
我覺得應該是微不足道的。你有想法嗎?
一些細節
創建新型別的明顯解決方案效果不佳,因為嵌套結構仍然使用它們MarshalJSON的 s.
以下是代碼示例:
func (de DeploymentExtended) MarshalJSON() ([]byte, error) {
objectMap := make(map[string]interface{})
if de.Location != nil {
objectMap["location"] = de.Location
}
if de.Properties != nil {
objectMap["properties"] = de.Properties
}
if de.Tags != nil {
objectMap["tags"] = de.Tags
}
return json.Marshal(objectMap)
}
(來源:https ://github.com/Azure/azure-sdk-for-go/blob/v62.0.0/services/resources/mgmt/2020-10-01/resources/models.go#L366 )
并且有很多屬性(例如Name等),我希望在我的 JSON 中看到這些屬性(對于Properties其他嵌套結構也是如此)。
此代碼的 Python 實作提供了該資料,我的軟體使用它,并且我(將代碼移植到 Go)也希望能夠從我的 Go 程式中匯出這些資料。
uj5u.com熱心網友回復:
您可以通過以下兩種方式執行此操作:
- 自定義型別(隱藏
MarshalJSON方法);要么 - 自定義封送拆收器(用于在運行時
reflect忽略任何MarshalJSON方法)
自定義型別
例如,采用這些嵌套型別:
type Y struct {
FieldZ string
}
type X struct {
Name string
Y Y
}
func (x *X) MarshalJSON() ([]byte, error) { return []byte(`"DONT WANT THIS"`), nil }
func (y *Y) MarshalJSON() ([]byte, error) { return []byte(`"DEFINITELY DONT WANT THIS"`), nil }
需要隱藏這些型別以避免MarshalJSON呼叫不需要的方法:
type shadowY struct {
FieldZ string
}
type shadowX struct {
Name string
Y shadowY
}
//
// transform original 'x' to use our shadow types
//
x2 := shadowX{
Name: x.Name,
Y: shadowY(x.Y),
}
https://go.dev/play/p/vzKtb0gZZov
反射
這是一個reflect基于簡單的 JSON 封送器來實作您想要的。它假定所有自定義編組器都使用指標接收器 - 并取消參考指標,因此標準庫json.Marshal不會“看到”它們:
func MyJSONMarshal(v interface{}) (bs []byte, err error) {
k := reflect.TypeOf(v).Kind() // ptr or not?
if k != reflect.Ptr {
return json.Marshal(v)
}
// dereference pointer
v2 := reflect.ValueOf(v).Elem().Interface()
return MyJSONMarshal(v2)
}
YMMV用這種方法。
https://go.dev/play/p/v9YjYRno7RV
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/436600.html
上一篇:在gota中設定列??名
