Go如何反序列化混合类型的JSON数组

时间:2018-02-16 17:18:37

标签: arrays json go

我正在为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"`
}

有没有办法解析这些混合类型的项目?我可以通过某种方式解决这个问题,强制所有整数元素被视为字符串吗?

更新: 这就是我所说的“空”。有正确数量的东西,但它们似乎没有被初始化。 enter image description here

2 个答案:

答案 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,您可以使用类型断言检查可以获得的值的类型。

检查go playground

上的代码
相关问题