为了账号安全,请及时绑定邮箱和手机立即绑定

json Unmarshal 将属性替换为零(如果它是在标签中构建的)

json Unmarshal 将属性替换为零(如果它是在标签中构建的)

Go
撒科打诨 2023-06-12 15:51:05
这是解组目标的结构:type ParsedObjectType struct{    Value struct{        E []struct {            B bool            C float32 `json:"coefficient"`            CE float32            G int `json:"group"`            P float32 `json:"period"`            T int `json:"type"`        }    }}soucre 字符串看起来像这样:{"B":false,"C":2.123,"CE":0,"G":1,"P":1000,"T":0}json.Unmarshal([]byte(string), ParsedObjectType)我收到后{    "B": false,    "coefficient": 0,    "CE": 0,    "group": 0,    "period": 0,    "type": 0}在属性中使用零而不是源数据
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

    你有两个大问题:


您的标签完全错误。例如,您的输入包含"C":2.123,但您的结构标签意味着 Unmarshaler 正在寻找"coefficient":2.123,它永远找不到。要更正此问题,请设置标签以匹配您的输入:


type ParsedObjectType struct{

    Value struct{

        E []struct {

            B  bool

            C  float32 `json:"C"`

            CE float32

            G  int     `json:"G"`

            P  float32 `json:"P"`

            T  int     `json:"T"`

        }

    }

}

请注意,现在您的结构字段与您的 JSON 键完全匹配,因此如果您愿意,您可以简单地完全消除您的 JSON 标签以简单起见:


type ParsedObjectType struct{

    Value struct{

        E []struct {

            B  bool

            C  float32

            CE float32

            G  int

            P  float32

            T  int

        }

    }

}

您的数据结构似乎与您的输入不匹配。您的输入似乎是单个对象,但您的输入需要一个对象中的一个对象。要更正此问题(假设您在问题中提供的输入是完整的),请删除数据结构中的额外层:


type ParsedObjectType struct{

    B  bool

    C  float32

    CE float32

    G  int

    P  float32

    T  int

}


查看完整回答
反对 回复 2023-06-12
?
精慕HU

TA贡献1845条经验 获得超8个赞

据我所知,json你有紧凑的名字,但它不应该强迫你在结构中创建神秘的名字。

在代码中,您应该使用有意义的名称,但在序列化格式中您可以使用同义词。

改编自您的示例:游乐场:https://play.golang.org/p/gbWhV3FfHMr

package main


import (

    "encoding/json"

    "log"

)


type ParsedObjectType struct {

    Value struct {

        Items []struct {

            Coefficient float32 `json:"C"`

            Group       int     `json:"G"`

            Period      float32 `json:"P"`

            TypeValue   int     `json:"T"`

        } `json:"E"`

    }

}


func main() {


    str := `{"Value": {

            "E": [

              {

                "B": false,

                "C": 2.123,

                "CE": 0,

                "G": 1,

                "P": 1000,

                "T": 0

              }

            ]

          }

        }`


    out := &ParsedObjectType{}

    if err := json.Unmarshal([]byte(str), out); err != nil {

        log.Printf("failed unmarshal %s", err)

    }


    log.Printf("Constructed: %#v", out)

}


查看完整回答
反对 回复 2023-06-12
?
慕森卡

TA贡献1806条经验 获得超8个赞

    如果你想解析{"B":false,"C":2.123,"CE":0,"G":1,"P":1000,"T":0}为


{

"B": false,

"coefficient": 0,

"CE": 0,

"group": 0,

"period": 0,

"type": 0

}

我认为你的结构应该声明为


struct {

        B bool

        coefficient float32 `json:"C"`

        CE float32

        group int `json:"G"`

        period float32 `json:"P"`

        type int `json:"T"`

    }

    如果你想解析{"B":false,"C":2.123,"CE":0,"G":1,"P":1000,"T":0}为


{

"B": false,

"coefficient": 0,

"CE": 0,

"group": 0,

"period": 0,

"type": 0

}

我认为你的结构应该声明为


struct {

        B bool

        coefficient float32 `json:"C"`

        CE float32

        group int `json:"G"`

        period float32 `json:"P"`

        type int `json:"T"`

    }


查看完整回答
反对 回复 2023-06-12
  • 3 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信