- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试更改 aws 上 s3 存储桶的策略。我为策略创建了以下 json 结构:
type Policy struct {
Version string `json:"Version"`
Id string `json:"Id"`
Statement []Statement `json:"Statement"`
}
type Statement struct {
Sid string `json:"Sid"`
Effect string `json:"Effect"`
Principal Principal `json:"Principal"`
Action []string `json:"Action"`
Resource []string `json:"Resource"`
}
type Principal struct {
AWS[]string `json:"AWS"`
}
这对于实现存储桶策略非常有效。当我尝试获取当前策略并对其进行修改时,问题就出现了。
如果一条语句只有一个 AWS、Action 或 Resource 值,Amazon 会将其从数组转换为简单值,导致我的解码失败。
有什么方法可以将 AWS/Action/Resource 值指定为字符串 slice 或只是一个字符串?
我知道有一些可用的包可以用来在某种程度上解决这个问题(例如,github.com/Jeffail/gabs
),但是创建JSON 结构,因为它相当简单。
最佳答案
作为接口(interface){}
的替代方法,您可以创建一个名为 MaybeSlice 的类型并在其上实现自定义 MarshalJSON 和 UnmarshalJSON 方法。
type MaybeSlice []string
func (ms *MaybeSlice) MarshalJSON() ([]byte, error) {
// Use normal json.Marshal for subtypes
if len(*ms) == 1 {
return json.Marshal(([]string)(*ms)[0])
}
return json.Marshal(*ms)
}
func (ms *MaybeSlice) UnmarshalJSON(data []byte) error {
// Use normal json.Unmarshal for subtypes
var s string
if err := json.Unmarshal(data, &s); err != nil {
var v []string
if err := json.Unmarshal(data, &v); err != nil {
return err
}
*ms = v
return nil
}
*ms = []string{s}
return nil
}
通过实现这些方法,MaybeSlice 类型将满足 json.Marshal 和 json.Unmarshal 所期望的接口(interface),因此您无需为所有类型实现自定义编码器,只需为这个类型实现自定义编码器。
MaybeSlice 是一个糟糕的名字,但希望你能理解。
这些自定义方法对于结构类型来说更容易,但我认为以上是正确的。如果我没记错的话,您需要将 Action
设为 *MaybeSlice
才能使用上述内容。
关于json - json 的 Golang 结构允许一个值可选地是一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38750027/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!