golang json无法正确解析带有嵌入式结构标签的字段

时间:2018-08-23 15:08:23

标签: json go tags field

package main

import (
    "encoding/json"
    "fmt"
)

type InnerData struct {
    M int64 `josn:"m"`
    N int64 `json:"n"`
}

//JSONData is a json data example
type JSONData struct {
    Hello string    `json:"hello"`
    Data  InnerData `json:"data"`
}

func main() {
    v := JSONData{Hello: "world", Data: InnerData{N: 100000, M: 123456}}
    mashaled, err := json.Marshal(&v)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(mashaled))
}

请注意,InnerData中的字段M具有标签m,因此预期结果为:{“ hello”:“ world”,“ data”:{“ m”:123456,“ n”:100000}}。 当我有

{"hello":"world","data":{"M":123456,"n":100000}}

有人知道如何解决该问题,或者我在哪里错了?

2 个答案:

答案 0 :(得分:1)

标签声明中的错误,其json的拼写为josn

type InnerData struct {
    M int64 `josn:"m"` // the spelling is not correct for json.
    N int64 `json:"n"`
}

将字段M的标签更改为

type InnerData struct {
    M int64 `json:"m"` // the spelling is not correct for json.
    N int64 `json:"n"`
}

还有一件事是InnerData不是嵌入式结构。在Golang规范中,嵌入式结构描述为:

  

使用类型声明但没有显式字段名称的字段称为   嵌入式领域。必须将嵌入字段指定为类型名称T   或作为指向非接口类型名称* T的指针,并且T本身可能不   是指针类型。非限定的类型名称充当字段名称。

//具有四个嵌入式字段的结构,分别是T1,* T2,P.T3和* P.T4类型

struct {
    T1        // field name is T1
    *T2       // field name is T2
    P.T3      // field name is T3
    *P.T4     // field name is T4
    x, y int  // field names are x and y
}

答案 1 :(得分:0)

您的代码中有错别字:

在您的InnerData中,您放置了josn而不是json

修正这些拼写错误,然后重试。