我的问题是, 我有一个JSON,它返回一个对象列表。 但有时候这个列表会给我一个单独的对象,以防这个。
我尝试使用下面的模式
Det []struct {
NItem string `json:"-nItem"`
Prod struct {
CProd string `json:"cProd"`
CEST string `json:"CEST"`
Cfop string `json:"CFOP"`
UCom string `json:"uCom"`
QCom string `json:"qCom"`
IndTot string `json:"indTot"`
VProd string `json:"vProd"`
CEANTrib string `json:"cEANTrib"`
UTrib string `json:"uTrib"`
NCM string `json:"NCM"`
CEAN string `json:"cEAN"`
XProd string `json:"xProd"`
VUnCom string `json:"vUnCom"`
QTrib string `json:"qTrib"`
VUnTrib string `json:"vUnTrib"`
} `json:"prod"`
Imposto struct {
VTotTrib string `json:"vTotTrib"`
ICMS struct {
ICMS00 struct {
Orig string `json:"orig"`
CST string `json:"CST"`
ModBC string `json:"modBC"`
VBC string `json:"vBC"`
PICMS string `json:"pICMS"`
VICMS string `json:" vICMS"`
} `json:"ICMS00"`
} `json:"ICMS"`
IPI struct {
CEnq string `json:"cEnq"`
IPITrib struct {
CST string `json:"CST"`
VBC string `json:"vBC"`
PIPI string `json:"pIPI"`
VIPI string `json:"vIPI"`
} `json:"IPITrib"`
} `json:"IPI"`
PIS struct {
PISAliq struct {
CST string `json:"CST"`
VBC string `json:"vBC"`
PPIS string `json:"pPIS"`
VPIS string `json:"vPIS"`
} `json:"PISAliq"`
} `json:"PIS"`
COFINS struct {
COFINSAliq struct {
CST string `json:"CST "`
VBC string `json:"vBC"`
PCOFINS string `json:"pCOFINS"`
VCOFINS string `json:"vCOFINS"`
} `json:"COFINSAliq"`
} `json:"COFINS"`
} `json:"imposto"`
} `json:"det"`
但效果很好,但是当det对象只接收元素时,unmarshal不起作用,只有当我删除那样的结构片时才有效
Det struct {
NItem string `json:"-nItem"`
Prod struct {
CProd string `json:"cProd"`
CEST string `json:"CEST"`
Cfop string `json:"CFOP"`
UCom string `json:"uCom"`
QCom string `json:"qCom"`
IndTot string `json:"indTot"`
VProd string `json:"vProd"`
CEANTrib string `json:"cEANTrib"`
UTrib string `json:"uTrib"`
NCM string `json:"NCM"`
CEAN string `json:"cE
整个结构看起来像这样。
SomeStruct struct {
ID string
json:"-Id"
Ide struct {...} json:"ide"
Total struct {
ICMSTot struct {...} json:"ICMSTot"
} json:"total"
Cobr struct { Dup struct {....} json:"dup"
} json:"cobr"
Versao string json:"-versao"
Emit struct { ... } json:"enderEmit"
Det []struct {
NItem string json:"-nItem"
Prod struct {
CProd string json:"cProd"
CEST string json:"CEST"
Cfop string json:"CFOP"
UCom string json:"uCom"
QCom string json:"qCom"
IndTot string json:"indTot"
VProd string json:"vProd"
CEANTrib string json:"cEANTrib"
UTrib string json:"uTrib"
NCM string json:"NCM"
CEAN string json:" cEAN"
XProd string json:"xProd"
VUnCom string json:"vUnCom"
QTrib string json:"qTrib"
VUnTrib string json:"vUnTrib"
} json:"prod"
答案 0 :(得分:0)
如果输入中的第一个非空白字节为[
,则将JSON解码为切片。否则,将JSON解码为结构。
func decode(data []byte) ([]Det, error) {
data = bytes.TrimSpace(data)
if len(data) == 0 {
return nil, errors.New("empty")
}
if data[0] == '[' {
var v []Det
err := json.Unmarshal(data, &v)
return v, err
}
var v [1]Det
err := json.Unmarshal(data, &v[0])
return v[:], err
}
如果Det
值是结构的成员,则使用RawMessage捕获JSON,然后使用上面的函数。
type SomeStruct struct {
....
DetRaw json.RawMessage `json:"Det"`
Det []Det `json:"-"`
....
}
var v SomeStruct
if err := json.Unmarshal(data, &v); err != nil {
// handle error
}
v.Det, err = decode([]byte(v.DetRaw))
if err != nil {
// handle error
}