我想得到一个表示像这样的json的字符串:
{“votes”:{“option_A”:“3”}}
并在其中加入“count”键所以它的结尾如下:
{“votes”:{“option_A”:“3”},“count”:“1”}
这就是我计划将它转换为json的原因,这样我就可以添加计数然后再将其作为字符串。 问题是我不知道那个json的结构,所以我不能使用json.Unmarshal(in, &myStruct)
,因为那个结构有所不同。
我怎样才能做到这一点?非常感谢你
答案 0 :(得分:57)
package main
import "encoding/json"
func main() {
in := []byte(`{ "votes": { "option_A": "3" } }`)
var raw map[string]interface{}
json.Unmarshal(in, &raw)
raw["count"] = 1
out, _ := json.Marshal(raw)
println(string(out))
}
答案 1 :(得分:40)
你真的只需要一个结构,并且如评论中所提到的,该字段上的正确注释将产生所需的结果。 JSON不是一些非常变化的数据格式,它定义得很好,任何一个json,无论它多么复杂和混乱,都可以很容易地表示,并且通过模式和Go中的对象可以100%准确地表示大多数其他OO编程语言。这是一个例子;
dependencies = [
('xyzapp', '0014_member_to_person'),
]
operations = [
migrations.CreateModel(
name='PersonVolunteer',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('personne', models.OneToOneField(to='xyzapp.Personne')),
],
),
]
https://play.golang.org/p/ScuxESTW5i
根据您最近的评论,您可以使用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))
}
来表示除了计数之外的数据,将计数作为一个字符串并将其余的blob推入interface{}
基本上接受任何事话虽这么说,Go是一种静态类型语言,具有相当严格的类型系统,并且重申,你的评论说“它可以是任何东西”都不是真的。 JSON不能是任何东西。对于任何JSON,都有模式,单个模式可以定义许多JSON变体。我建议你花些时间来理解你的数据的结构,而不是在它绝对可以无法定义的概念下一起攻击,并且对于知道他们正在做什么的人来说可能很容易。
答案 2 :(得分:0)
我遇到的问题是,有时我需要获得深刻的价值
嵌套通常,您需要在每个级别上进行类型声明,所以我去了
并提出了一个方法,该方法需要一个map[string]interface{}
和一个
string
键,并返回结果map[string]interface{}
。
出现在我身上的问题是,在某些深度你会遇到 切片而不是地图。因此,我还添加了从地图返回切片的方法,并且 切片中的地图。我没有做一个切片到切片,但您可以轻松地添加一个 如果需要的话。方法如下:
package main
type Slice []interface{}
type Map map[string]interface{}
func (m Map) M(s string) Map {
return m[s].(map[string]interface{})
}
func (m Map) A(s string) Slice {
return m[s].([]interface{})
}
func (a Slice) M(n int) Map {
return a[n].(map[string]interface{})
}
和示例代码:
package main
import (
"encoding/json"
"fmt"
"log"
"os"
)
func main() {
o, e := os.Open("a.json")
if e != nil {
log.Fatal(e)
}
in_m := Map{}
json.NewDecoder(o).Decode(&in_m)
out_m := in_m.
M("contents").
M("sectionListRenderer").
A("contents").
M(0).
M("musicShelfRenderer").
A("contents").
M(0).
M("musicResponsiveListItemRenderer").
M("navigationEndpoint").
M("browseEndpoint")
fmt.Println(out_m)
}