我有一个这样的结构:
type Data struct {
Id string
Value string
Custom customtype1
Special customtype2
TimeStamp Time
}
var model Data
我正在从 JSON 对象读取数据。因为 JSON 的结构非常不同,所以我不能直接将 JSON 解码到结构中。因此,我试图将 JSON 对象的字段与结构的字段一一“匹配”。我实际上不需要将 JSON 数据正确解码到结构中,我真正需要的是能够为每个字段分配正确的类型到它的值。
所以我将 JSON 解码为通用接口(interface),然后将其转换为 map[string]interface{}
并对其进行迭代。对于每个字段,我尝试在使用 reflect
获得的 model
变量中找到字段名称的匹配项。
现在一切正常,但是当我尝试为值获取正确的类型时,问题就出现了。
我可以使用 reflect
从 model
中获取某个字段的 Type
,但是我不能用它来转换我从 JSON 中获取的值的类型,因为它不是 type
。我也不能使用 switch
语句,因为这是情况的简化版本,实际上我正在处理 1000 多种不同的可能类型。如何将每个字段的值转换为它们正确的 type
?
我唯一能想到的解决方法是重新创建一个与结构格式匹配的 json 字符串,然后将其解码为正确的结构,但这似乎很复杂。一定有更简单的方法吧?
这是一个示例 JSON(我无法更改此结构,除非我在我的 Go 程序中对其进行修改):
{
"requestId": 101901,
"userName": "test",
"options": [1, 4],
"request": {
"timeStamp": {
"Value1": "11/02/2018",
"Value2": "11/03/2018"
},
"id": {
"Value1": "123abcd",
"Value2": "0987acd",
"Value3": "a9c003"
},
"custom": {
"Value1": "customtype1_value",
"Value2": "customtype1_value"
}
}
}
最佳答案
我反对您目前的做法。您没有提供足够的上下文来告诉我们为什么您选择一个接一个地解码,但 Go 对 JSON 的支持足够好,我猜它能够做您想做的事.
您是否知道 Marshall 对 struct tags 的支持? ?这些可能会满足您正在寻找的目的。你的结构看起来更像:
type Data struct {
Id string `json:"id"`
Value string `json:"value"`
Custom customtype1 `json:"custom_type"`
Special customtype2 `json:"special_type"`
TimeStamp Time `json:"timestamp"`
}
如果您的问题是自定义类型不知道如何解码,您可以为它们定义自定义解码函数。
这将使您能够像下面这样解码一个对象:
{
"id": "foo",
"value": "bar",
"custom_type": "2342-5234-4b24-b23a",
"special_type": "af23-af2f-rb32-ba23",
"timestamp": "2018-05-01 12:03:41"
}
关于json - 为从 JSON 读取的数据分配适当的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50549535/