【问题标题】:How to parse JSON string to struct如何将 JSON 字符串解析为结构
【发布时间】:2017-11-13 17:54:52
【问题描述】:

我有struct的Request,值是可选的:

type Request struct {
    Operation string      `json:"operation"`
    Key string            `json:"key"`
    Value string          `json:"value"`
}

以及应该将json字符串解析为struct^的函数

go func() {
    s := string("{'operation': 'get', 'key': 'example'}")
    data := Request{}
    json.Unmarshal([]byte(s), data)
    log.Printf("Operation: %s", data.Operation)
}

由于某种原因 data.Operation 是空的。这里有什么问题?

【问题讨论】:

  • 您还有一个没有函数调用的go 关键字。如果这是一个错字,缺少(),那么你就有一个没有任何同步的goroutine。
  • 作为最常见的问题之一,不要忽略错误。 json.Unmarshal 返回错误类型。该错误的输出会告诉你你的 json 有无效的引号,在你修复它之后,会告诉你你的目标变量需要是一个指针。

标签: json parsing go


【解决方案1】:

两个问题,第一,你的json无效,需要使用"而不是'

其次,您必须解组到 &data 而不是 data

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

package main

import (
    "fmt"
    "encoding/json"
)

type Request struct {
    Operation string      `json:"operation"`
    Key string            `json:"key"`
    Value string          `json:"value"`
}

func main() {
    s := string(`{"operation": "get", "key": "example"}`)
    data := Request{}
    json.Unmarshal([]byte(s), &data)
    fmt.Printf("Operation: %s", data.Operation)
}

旁注,如果您一直在检查错误,您会看到这个:

s := string("{'operation': 'get', 'key': 'example'}")

err := json.Unmarshal([]byte(s), data)
if err != nil {
    fmt.Println(err.Error()) 
    //json: Unmarshal(non-pointer main.Request)
}

err := json.Unmarshal([]byte(s), &data)
if err != nil {
    fmt.Println(err.Error()) 
    //invalid character '\'' looking for beginning of object key string
}

【讨论】:

    猜你喜欢
    • 2018-10-20
    • 2012-07-25
    • 2011-04-19
    • 2023-03-14
    • 2020-04-15
    • 2018-08-26
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多