这是解组目标的结构:
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"`
}
}
}
字串看起来像这样:
{"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
}
在属性中使用零代替源数据
答案 0 :(得分:1)
您有两个大问题:
您的标签完全错误。例如,您的输入包含"C":2.123
,但是您的struct标记表示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"`
}
}
}
请注意,现在您的struct字段与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
}
答案 1 :(得分:0)
如果要将{"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"`
}
答案 2 :(得分:0)
据我在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)
}