2014-08-30 18 views
0

我试图将http请求中的json字符串转换为map/s切片。 而且我还应该将一片map/s转换为用于http响应的json字符串。在不使用结构的情况下将json转换为切片地图和切片地图到JSON中使用结构

我想在下面两种情况下将以下内容转换为map/s片。 来自http请求的json字符串可能是多个相同键值json对象的数组,例如;

[ 
     { title: 'JavaScript: The Good Parts', author: 'Douglas Crockford', 
      releaseDate: '2008', keywords: 'JavaScript Programming' }, 
     { title: 'The Little Book on CoffeeScript', author: 'Alex MacCaw', 
      releaseDate: '2012', keywords: 'CoffeeScript Programming' }, 
     { title: 'Scala for the Impatient', author: 'Cay S. Horstmann', 
      releaseDate: '2012', keywords: 'Scala Programming' }, 
     { title: 'American Psycho', author: 'Bret Easton Ellis', 
      releaseDate: '1991', keywords: 'Novel Splatter' }, 
     { title: 'Eloquent JavaScript', author: 'Marijn Haverbeke', 
      releaseDate: '2011', keywords: 'JavaScript Programming' } 
] 

或单一的一样;

{ title: 'Eloquent JavaScript', author: 'Marijn Haverbeke', 
    releaseDate: '2011', keywords: 'JavaScript Programming' } 

而第二项任务是将一片map/s转换为json字符串。

但是,我无法在这两个程序中成功。

json软件包可以为结构执行这两个任务,我知道它。

对于设计问题,我不应该使用事先编码的结构。

有没有一种已知的方式来执行这些在Go中。

回答

2

你真的可以使用使用map[string]interface{}这将与{ "title": ....., "keywords": ["CoffeeScript", "Programming"] }就好工作

你不得不使用这样的:

for i := 0; i < len(b); i++ { 
    fmt.Printf("%s by %s was release at %s\n", b[i]["title"], b[i]["author"]) 
    switch v := b[i]["keywords"].(type) { 
    case []interface{}: 
     for i := 0; i < len(v); i++ { 
      switch v := v[i].(type) { 
      case string: 
       fmt.Println("\tstring in a slice", v) 
      case float64: //numbers in json are float64 by default 
       fmt.Println("\tnumber in a slice", v) 
      default: 
       fmt.Printf("\tunknown type (%T)", v, v) 
      } 
     } 
    case string: 
     fmt.Println("\tstring", v) 
    } 
} 

playground

+0

我明白你的回答,我解释的问题的嵌套性质的解决方案与'interface {}'有关。不知道如何使用它,我会研究它,也许我应该提醒你我不是在印刷东西。 – fsc 2014-08-30 18:05:56

+0

^这是你如何使用它,我会添加更详细的例子 – OneOfOne 2014-08-30 18:08:08

+1

@FarukSelcuk再者,开关内,v是正确的类型,所以在'情况下string' v是一个字符串,等等 – OneOfOne 2014-08-30 18:17:07

1

您应该使用json.NewDecoder将JSON转换为切片地图,并使用json.NewEncoder将切片切片转换为JSON。

我在这里写的http://play.golang.org/p/jbXYGC5pp2

看到解释在注释中。

我希望这会帮助

+0

例如,当一个值是一个像下面的字符串中的'keywords'键值那样的数组时,嵌套的json对象是可能的[[ {title:'JavaScript:The Good Parts',作者:'Douglas Crockford', releaseDate:'2008',keywords:[“JavaScript”,“Programming”]},...' – fsc 2014-08-30 15:22:43

+1

@FarukSelcuk使用结构。如果你想要使用地图,我认为这是不可能的,因为地图只是关键值对 – pyk 2014-08-30 15:29:52

+0

理论上应该可以实现一个完整的解析器,它可以挖掘到无限深嵌套的jsons,即(每个)json,反之亦然,通过在字符串上写入函数。但对我来说近似乎是不可能的。感到惊讶的是它不存在,存在的一件事是在剩下的可能性剩下的时候完成一件事,或者因为它们是不可能的。 – fsc 2014-08-30 15:33:39