在GoLang中将字符串转换为json或struct

时间:2016-11-04 18:11:47

标签: json go

我想得到一个表示像这样的json的字符串:

  

{“votes”:{“option_A”:“3”}}

并在其中加入“count”键所以它的结尾如下:

  

{“votes”:{“option_A”:“3”},“count”:“1”}

这就是我计划将它转换为json的原因,这样我就可以添加计数然后再将其作为字符串。 问题是我不知道那个json的结构,所以我不能使用json.Unmarshal(in, &myStruct),因为那个结构有所不同。 我怎样才能做到这一点?非常感谢你

3 个答案:

答案 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))
}

https://play.golang.org/p/QUyL3cyTAC

答案 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)
}