将JSON响应表示为struct

时间:2012-12-06 15:05:06

标签: go

我正在调用Google Translate API,并希望将响应表示为结构。 JSON响应是:

{
 "data": {
  "translations": [
   {
    "translatedText": "Mi nombre es John, nació en Nairobi y tengo 31 años de edad",
    "detectedSourceLanguage": "en"
   }
  ]
 }
}

我试图想出一个结构:

type Translations struct{
  TranslatedText string
  SourceLanguage string
}

type Translation struct{
  Data string
  Value *[]Translations
}

或:

type Translations struct{
  TranslatedText string
  SourceLanguage string
}

type Translation struct{
  Data string
  Value Translations
}

这是正确的方法吗?

2 个答案:

答案 0 :(得分:4)

这是一个将两个结构定义合并为一个的工作示例。

http://play.golang.org/p/nI0Qet6R78

package main

import (
    "fmt"
    "encoding/json"
    )

type Translation struct{
    Data struct {
        Translations []struct {
            TranslatedText string
            DetectedSourceLanguage string
        }
    }
}

func main() {

    source := []byte(`
    {
     "data": {
      "translations": [
       {
        "translatedText": "Mi nombre es John, nació en Nairobi y tengo 31 años de edad",
        "detectedSourceLanguage": "en"
       }
      ]
     }
    }
    `)

    var j Translation
    err := json.Unmarshal(source, &j)
    if err != nil {
        panic(err)
    }
    for _,t := range j.Data.Translations {
        fmt.Printf("----\n")
        fmt.Printf("translatedText: %s\n", t.TranslatedText)
        fmt.Printf("detectedSourceLanguage: %s\n", t.DetectedSourceLanguage)
    }
}

答案 1 :(得分:0)

您可以将数据分为三个部分。单个translation包含在translations数组中。您的主要结构是data

我发现最容易从最内层的结构开始并定义它然后以我的方式运行到外部结构。

这些的表示可以这样定义:

type translation struct {
    TranslatedText string
    SourceLanguage string `json:"detectedSourceLanguage"`
}

type translations struct {
    Translations []translation
}

type data struct {
    Data translations
}

如果数据结构不是太复杂,你可以将它们全部放在一起:

type data struct {
    Data struct {
        Translations []struct {
            TranslatedText string
            SourceLanguage string `json:"detectedSourceLanguage"`
        }
    }
}

完整的工作example

package main

import (
    "encoding/json"
    "fmt"
)

var json_s string = `{
  "data": {
    "translations": [
      {
        "translatedText": "Mi nombre es John, nació en Nairobi y tengo 31 años de edad",
        "detectedSourceLanguage": "en"
      }
    ]
  }
}`

type data struct {
    Data struct {
        Translations []struct {
            TranslatedText string
            SourceLanguage string `json:"detectedSourceLanguage"`
        }
    }
}

func main() {
    var translation data
    err := json.Unmarshal([]byte(json_s), &translation)
    if err != nil {
        panic(err)
    }

    fmt.Printf("%+v", translation)
}