来自json的不同数据结构

时间:2018-04-04 00:37:44

标签: go

我的问题是,  我有一个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"

1 个答案:

答案 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
}

Playground example

如果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
}