json - 为从 JSON 读取的数据分配适当的类型

标签 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 解码为通用接口(interface),然后将其转换为 map[string]interface{} 并对其进行迭代。对于每个字段,我尝试在使用 reflect 获得的 model 变量中找到字段名称的匹配项。

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

我可以使用 reflectmodel 中获取某个字段的 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/

相关文章:

go - 如何禁用删除未使用的导入?

swift - 在结构内指定 Hashable 类型约束

c++ - cout如何区分基本类型?

json - Gatsbyjs 中的 GraphQL - 仅返回包含特定字段的数据

python - Python 中带有 SQL 数据的 Google Charts API

go - 为什么Golang的MD5分布看起来不统一?

go - 如何将字符串转换为 float

swift - 在 Swift 4 中,如何获取存储在 'Any' 类型变量中的数据类型的字符串表示形式?

json - JSON 是否允许数字的正号?

java - 当事先不知道 key 时使用 gson 反序列化 JSON 对象