Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将JSON字符串解析为struct_Json_Parsing_Go - Fatal编程技术网

如何将JSON字符串解析为struct

如何将JSON字符串解析为struct,json,parsing,go,Json,Parsing,Go,我有请求的struct,值是可选的: type Request struct { Operation string `json:"operation"` Key string `json:"key"` Value string `json:"value"` } 和函数,该函数应将json字符串解析为struct^ go func() { s := string("{'operation': 'get', 'key

我有请求的
struct
,值是可选的:

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)
}

由于某些原因,数据。操作为空。这里有什么问题?

两个问题,首先,您的json无效,它需要使用
而不是

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

请注意,如果您一直在检查错误,您会看到以下内容:

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

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

您还有一个
go
关键字,带但不带函数调用。如果是打字错误,则缺少
()
,然后您就有了一个没有任何同步的goroutine。这是最常见的问题之一,不要忽略错误。json.Unmarshal返回一个错误类型。该错误的输出会告诉您json有无效的引号,在您修复后,会告诉您目标变量需要是一个pointeR
err := json.Unmarshal([]byte(s), data)
if err != nil {
    fmt.Println(err.Error()) 
    //json: Unmarshal(non-pointer main.Request)
}

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