json Unmarshal如果在标签中构造属性,则将其替换为零

时间:2019-03-03 05:25:47

标签: json go

这是解组目标的结构:

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
}

在属性中使用零代替源数据

3 个答案:

答案 0 :(得分:1)

您有两个大问题:

  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
            }
        }
    }
    
  2. 您的数据结构似乎与您的输入不匹配。您的输入似乎是单个对象,但是您的输入需要一个对象内的对象。要纠正此问题(假设您在问题中提供的输入是完整的),请摆脱数据结构中的额外层:

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