我想得到一个表示像这样的json的字符串:
{"votes":{"option_A":"3"}}
并在其中包含一个"计数"键,所以它结束如下:
{"votes":{"option_A":"3"},"count":"1"}
这就是我计划将它转换为json的原因,这样我就可以添加计数然后再将其作为字符串.问题是我不知道那个json的结构,所以我不能使用json.Unmarshal(in, &myStruct)因为结构不同.我怎样才能做到这一点?非常感谢你
fse*_*art 63
package main
import "encoding/json"
func main() {
in := []byte(`{ "votes": { "option_A": "3" } }`)
var raw map[string]interface{}
if err := json.Unmarshal(in, &raw); err != nil {
panic(err)
}
raw["count"] = 1
out, _ := json.Marshal(raw)
println(string(out))
}
Run Code Online (Sandbox Code Playgroud)
https://play.golang.org/p/QUyL3cyTAC
eva*_*nal 43
您真的只需要一个结构,并且如注释中所提到的,该字段上的正确注释将产生所需的结果.JSON不是一些非常变化的数据格式,它定义得很好,任何一个json,无论它多么复杂和混乱,都可以很容易地表示,并且通过模式和Go中的对象可以100%准确地表示大多数其他OO编程语言.这是一个例子;
package main
import (
"fmt"
"encoding/json"
)
type Data struct {
Votes *Votes `json:"votes"`
Count string `json:"count,omitempty"`
}
type Votes struct {
OptionA string `json:"option_A"`
}
func main() {
s := `{ "votes": { "option_A": "3" } }`
data := &Data{
Votes: &Votes{},
}
err := json.Unmarshal([]byte(s), data)
fmt.Println(err)
fmt.Println(data.Votes)
s2, _ := json.Marshal(data)
fmt.Println(string(s2))
data.Count = "2"
s3, _ := json.Marshal(data)
fmt.Println(string(s3))
}
Run Code Online (Sandbox Code Playgroud)
https://play.golang.org/p/ScuxESTW5i
根据您最近的评论,您可以通过使用一个interface{}来表示除计数之外的数据来解决这个问题,使计数成为一个字符串,并将其余的blob推入interface{}其中将接受基本上任何东西.话虽这么说,Go是一种静态类型语言,具有相当严格的类型系统,并且重申,你的评论说"它可以是任何东西"都不是真的.JSON不能是任何东西.对于任何JSON,都有模式,单个模式可以定义许多JSON变体.我建议你花些时间来理解你的数据结构,而不是在它完全可以无法定义的概念下将它们整合在一起,对于知道自己在做什么的人来说可能很容易.
| 归档时间: |
|
| 查看次数: |
79773 次 |
| 最近记录: |