如何在Golang中定义这种类型的数据?

huangapple go评论152阅读模式
英文:

how can I defined this type data in golang

问题

我有一个像'{"{\"hello\":\"world\"}"}'这样的数据,它是在PostgreSQL中的一个数组JSON。

我不知道如何在Golang中处理它。
我知道我可以用string来定义,然后使用json.Unmarshal来解决,但我想知道是否有一种方法可以将其获取到一个struct中。

英文:

I have a data like '{"{\"hello\":\"world\"}"}', it's a array json in postgresql.

I don't know how to handle it in golang.
I know I can define with string then use json.Unmarshal to slove, but I want to know if there is a way to get it in a struct

答案1

得分: 1

我假设你发布了错误的 JSON,假设它是 '{ "hello": "world" }'
结构体有预定义的字段,对于任意的 JSON 数据,事先是无法知道的。可能的解决方案是将其转换为 map。

var data interface{}
b := []byte(`{ "hello": "world" }`)
err := json.Unmarshal(b, &data)
if err != nil {
    panic(err)
}
fmt.Print(data)

当你打印出数据时,你可能会得到类似于 map[hello:world] 的结果,它的形式是 map[string]interface{}

然后,你可以使用类型断言(type assert)来循环遍历 map 结构,直到将所有的 interface{} 类型断言为具体类型。

for k, v := range data.(map[string]interface{}) {
    switch val := v.(type) {
    case string:
        v = val
    default:
        fmt.Println(k, "是未知类型")
    }
}

当处理任意的输入 JSON 时,map 是一种理想的数据结构。然而,如果 JSON 是从具有预定义模式的 SQL 表生成的,你可以使用具有相同结构的结构体来替代 map。

type Hello struct {
    Hello string `json:"hello"`
}
英文:

I assume you posted incorrect JSON and let's say it's '{"hello": "world"}
A struct has a predefined fields, and with arbitrary JSON coming in it's impossible to know ahead. The possible solution would be to convert it into a map.

var data interface{}
b := []byte(`{"hello": "world"}`)
err := json.Unmarshal(b, &data)
if err != nil {
        panic(err)
}
fmt.Print(data)

As you print out the data, you'll probably get something like.
map[hello:world]

Which is in the form of map[string]interface{}.

Then you can use type switch to loop into the map structure until you type assert all the interface{}.

for k, v := range data.(map[string]interface{}) {
        switch val := v.(type) {
        case string:
                v = val
        default:
                fmt.Println(k, "is unknown type")
        }
}

Map is an ideal data structure when dealing with arbitrary incoming JSON. However, if the JSON is generated from an SQL table with predefined schemas, you can use a struct with the same structure instead of a map.

type Hello struct {
        Hello string `json:"hello"`
}

huangapple
  • 本文由 发表于 2016年3月17日 00:51:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/36042047.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定