为从JSON

时间:2018-05-27 06:15:00

标签: json go types casting

我有一个像这样的结构:

type Data struct {
    Id         string
    Value      string
    Custom     customtype1
    Special    customtype2
    TimeStamp  Time        
}

var model Data

我正在从JSON对象中读取数据。因为JSON的结构非常不同,所以我不能直接将JSON解组到结构中。所以我试图将JSON对象中的字段逐个“匹配”到结构的字段。我实际上并不需要将JSON数据正确地解组到结构中,我真正需要的是能够为每个字段为其值分配正确的类型。

因此,我将JSON解组为通用接口,然后将其转换为map[string]interface{}并对其进行迭代。对于每个字段,我尝试在使用model的{​​{1}}变量中的字段名称中找到匹配项。

现在一切正常,但是当我尝试为值获取正确的类型时会出现问题。

我可以使用reflectType获取某个字段的model,但是我无法使用它来转换我从JSON获取的值的类型因为那不是reflect。我也不能使用type语句,因为这是情况的简化版本,实际上我正在处理1000多种不同的可能类型。如何将每个字段的值转换为正确的switch

我能想到解决这个问题的唯一方法是重新创建一个匹配结构格式的json字符串,然后将其解组为正确的结构,但这似乎是复杂的方法。当然必须有一个更简单的方法吗?

这是一个示例JSON(我无法更改此结构,除非我在Go程序中重做它):

type

1 个答案:

答案 0 :(得分:0)

我会反对你目前的做法。你没有提供足够的上下文来告诉我们为什么你选择逐个解组,但是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"
}