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
}
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)
}
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"`
}
- 3 回答
- 0 关注
- 167 浏览
添加回答
举报