1

我已经在下面捣碎了这个 Go twitter 客户端,客户端在显示结果方面仍然需要一些工作,我想将 JSON 结果http://pastie.org/7298856表示为 Go 结构,我不'不需要 JSON 结果中的所有字段,任何指针?

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

type TwitterResult struct{

}

var twitterUrl = "http://search.twitter.com/search.json?q=%23KOT"

func retrieveTweets(c chan<- string) {
    for {
        resp, err := http.Get(twitterUrl)
        if err != nil {
            log.Fatal(err)
        }

        defer resp.Body.Close()
        body, err := ioutil.ReadAll(resp.Body)
        c <- string(body)
    }

}

func displayTweets(c chan string) {
    fmt.Println(<-c)
}

func main() {
    c := make(chan string)
    go retrieveTweets(c)
    for {
        displayTweets(c)
    }

}
4

2 回答 2

2

encoding/json包提供了一种将 JSON 直接解包到结构中的方法。以下示例解析 JSON 内容(地图)并将字段分配给由 struct 标签标识的相应目标。例如,键"someId"被映射到带有标签的结构字段json:"someId"你可以在这里摆弄代码。

package main

import "fmt"
import "encoding/json"

type Example struct {
     Id    int `json:"someId"`
     Content string `json:"someContent"`
}

func main() {
    var xmpl Example

    input := `{"someId": 100, "someContent": "foo"}`

    json.Unmarshal([]byte(input), &xmpl)

    fmt.Println(xmpl)
}

您可以在文档中找到有关语法的详细信息。默认情况下忽略结构中未提及的字段。

于 2013-04-04T00:41:02.530 回答
0

我发现这个https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/dNjIs-O64do足以为我指明正确的方向。更新:我的代码实现

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "time"
)

type twitterResult struct {
    Results []struct {
        Text     string `json:"text"`
        Ids      string `json:"id_str"`
        Name     string `json:"from_user_name"`
        Username string `json:"from_user"`
        UserId   string `json:"from_user_id_str"`
    }
}

var (
  twitterUrl = "http://search.twitter.com/search.json?q=%23UCL"
  pauseDuration = 5 * time.Second
)

func retrieveTweets(c chan<- *twitterResult) {
    for {
        resp, err := http.Get(twitterUrl)
        if err != nil {
            log.Fatal(err)
        }

        defer resp.Body.Close()
        body, err := ioutil.ReadAll(resp.Body)
        r := new(twitterResult) //or &twitterResult{} which returns *twitterResult
        err = json.Unmarshal(body, &r)
        if err != nil {
            log.Fatal(err)
        }
        c <- r
        time.Sleep(pauseDuration)
    }

}

func displayTweets(c chan *twitterResult) {
    tweets := <-c
    for _, v := range tweets.Results {
        fmt.Printf("%v:%v\n", v.Username, v.Text)
    }

}

func main() {
    c := make(chan *twitterResult)
    go retrieveTweets(c)
    for {
        displayTweets(c)
    }

}

该代码运行良好,我只是想知道创建一个指向结构的指针的通道是否是惯用的 Go。

于 2013-04-03T11:45:45.377 回答