【问题标题】:Golang JSON ArrayGolang JSON 数组
【发布时间】:2018-02-19 20:32:11
【问题描述】:

我正在尝试使用 WordNik () 为该脚本的字典获取随机单词:https://github.com/jmagrippis/password

WordNik 正在输出:

[{"id":7936915,"word":"Tanganyikan"},{"id":27180,"word":"cartographic"},{"id":48094,"word":"deterministic"},{"id":1485119,"word":"higher-risk"},{"id":120986,"word":"juristic"},{"id":1830806,"word":"magnetorheological"},{"id":320495,"word":"quelled"},{"id":324610,"word":"remoter"},{"id":215158,"word":"telemetric"},{"id":225207,"word":"uninquisitive"}]

这是我的代码:

package main

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

    "github.com/jmagrippis/password"
)

type Words struct {
    id   []int64
    word []string
}

type GetWordsResponse struct {
    WordList []Words
}

func getWords(speech string) (*GetWordsResponse, error) {

    url := fmt.Sprintf("http://api.wordnik.com/v4/words.json/randomWords?hasDictionaryDef=false&includePartOfSpeech=%s&minCorpusCount=0&maxCorpusCount=-1&minDictionaryCount=1&maxDictionaryCount=-1&minLength=5&maxLength=-1&limit=10&api_key=api_key", speech)

    res, err := http.Get(url)
    if err != nil {
        panic(err.Error())
    }

    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        panic(err.Error())
    }

    var s = new(GetWordsResponse)
    var arr []string
    _ = json.Unmarshal([]byte(body), &arr)
    log.Printf("Unmarshaled: %v", arr)
    return s, err
}

func main() {

    dictionary := &password.Dictionary{
        Adjectives: []string{"beautiful", "homely", "magical", "posh", "excellent"},
        Subjects:   []string{"mermaids", "unicorns", "lions", "piranhas"},
        Verbs:      []string{"love", "fancy", "eat", "bring", "fear", "aggravate"},
        Adverbs:    []string{"cuddling", "slapping", "shouting", "jumping"},
        Objects:    []string{"teddy-bears", "diamonds", "buckets", "boxes"},
    }

    generator := password.NewGenerator(dictionary, time.Now().UnixNano())
    pass := generator.Generate()

    fmt.Printf("%s", pass)

    getWords("Verb")
}

如您所见,我正在尝试使用 WordNik API 来请求副词、名词等,然后根据这些单词制作字典以生成密码。我对数组和处理数据很糟糕。

【问题讨论】:

  • 您可能不想将您的 API 密钥包含在有关堆栈溢出的帖子中......我会使我的密钥无效并生成一个新的
  • 如果您可以将问题归结为非常简单的问题....这是我无法解组的数据,这里是代码崩溃的地方等....尝试隔离您的部分代码已损坏,不包含 API 密钥,然后发布 play.golang 链接并包含我们将在该链接中找到的详细信息
  • 导出结构字段。
  • 不仅你的字段没有导出,而且GetWordsResponse与响应中的json结构不匹配。

标签: go passwords


【解决方案1】:

正如 cmets 中所指出的,您需要导出字段以便对它们进行解组

encoding/json 包依赖于反射,因为它在另一个包中,它不能访问未导出的字段。 (在 go 中,以小写字母开头的字段、方法或函数未导出,而以大写字母开头的字段、方法或函数被导出)

那么你的示例 json 根本不包含 WordList,所以你想要的是直接解组到单词数组中。此外,words 对象仅由 Id 和 Word 组成,而不是数组本身。

type Words struct {
    Id   int64
    Word string
}

func main() {
    .... 
    var words []Words
    // you don't need to read the whole body first, you can decode in the same turn like this
    err := json.NewDecoder(req.Body).Decode(&words)
    if nil != err {
       log.Fatal(err)
    }
   ...
}

另一个非常重要的事情是你不应该忽略错误。这将帮助您调试问题。 (我的意思是 _ = json.Unmarshal)

至于从 go 开始,您可以实现一个简单的测试来查看您的代码是否按预期工作。

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

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 2015-06-10
    • 2021-07-22
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2017-09-07
    相关资源
    最近更新 更多