我正在为aigaming.com编写一个go客户端,当我发出无效请求时,响应将包含一些错误信息。我希望用struct
捕获此响应,但是,当类型开始混合时,我遇到了麻烦。
错误数据的JSON结构如下所示:
{
"errorMessage":"An error occurred (ValidationException) when calling the Query operation: ExpressionAttributeValues contains invalid value: One or more parameter values were invalid: An AttributeValue may not contain an empty string for key :v0",
"errorType":"ClientError",
"stackTrace":[
[
"/var/task/OfferGame.py",
612,
"lambda_handler",
"game = offerGame.createOffer()"
],
[
"/var/task/OfferGame.py",
586,
"createOffer",
"gameRow = self.findSuitableWaitingGame()"
],
[
"/var/task/OfferGame.py",
503,
"findSuitableWaitingGame",
"Key('GameStyleId_GameStatus').eq(str(self.gameStyleId) + '_' + self.Game.KEY_GAME_STATUS_WAITING)"
]
// There are more items, but I'll omit them for brevity
]
}
这一点很容易捕获,但问题来自stackTrace
项。它是一个混合类型的数组数组。
到目前为止,我所获得的最佳结果是这个结构。它实际上并没有给我任何数据(所有元素都是空的),但它带有正确数量的元素和嵌套元素。
type ErrorResponse struct {
ErrorMessage string `json:"errorMessage"`
ErrorType string `json:"errorType"`
StackTrace [][]interface{} `json:"stackTrace"`
}
有没有办法解析这些混合类型的项目?我可以通过某种方式解决这个问题,强制所有整数元素被视为字符串吗?
答案 0 :(得分:1)
你走在正确的轨道上,继续。每当您需要StackTrace中的内容时,请使用type assertions并根据实际类型执行代码。请注意,类型断言返回2个值,检查第二个值以查看假定类型是否正确。
答案 1 :(得分:0)
将json解组为通用interface
jsonstr := []byte(`{
"errorMessage":"An error occurred (ValidationException) when calling the Query operation: ExpressionAttributeValues contains invalid value: One or more parameter values were invalid: An AttributeValue may not contain an empty string for key :v0",
"errorType":"ClientError",
"stackTrace":[
[
"/var/task/OfferGame.py",
612,
"lambda_handler",
"game = offerGame.createOffer()"
],
[
"/var/task/OfferGame.py",
586,
"createOffer",
"gameRow = self.findSuitableWaitingGame()"
],
[
"/var/task/OfferGame.py",
503,
"findSuitableWaitingGame",
"Key('GameStyleId_GameStatus').eq(str(self.gameStyleId) + '_' + self.Game.KEY_GAME_STATUS_WAITING)"
]
]
}`)
var dat interface{}
if err := json.Unmarshal(jsonstr, &dat); err != nil {
panic(err)
}
循环通过基础map[string]interface{}
for _, value := range dat.(interface{}).(map[string]interface{}){
switch tt := value.(type){
case string:
fmt.Printf("type is string", tt)
case float64:
fmt.Printf("type is float64", tt)
case bool:
fmt.Printf("type is boolean", tt)
case interface{}:
fmt.Printf("type is interface{}", tt)
default:
fmt.Printf("type is unknown", tt)
}
}
最后使用switch
,您可以使用类型断言检查可以获得的值的类型。