douhui9192 2017-08-15 03:58
浏览 107
已采纳

在Go中循环嵌套JSON元素

I am receiving a JSON response from an API that contains one or more "entities". The JSON looks like this:

{
    "3211": {
        "entity_id": "3211",
        "status": "complete",
        "coupon_code": "COUPON",
        "shipping_description": "Shipping - AU Courier",
        "customer_id": "2775",
        "base_discount_amount": "-50.0000",
        "base_grand_total": "149.0000",
        "base_shipping_amount": "0.0000",
        "base_shipping_tax_amount": "0.0000",
        "base_subtotal": "199.0000",
        "base_tax_amount": "0.0000",
        "base_total_paid": "149.0000",
        "base_total_refunded": null,
        "discount_amount": "-50.0000",
        "grand_total": "149.0000",
        "shipping_amount": "0.0000",
        "shipping_tax_amount": "0.0000",
        "store_to_order_rate": "1.0000",
        "subtotal": "199.0000",
        "tax_amount": "0.0000",
        "total_paid": "149.0000",
        "total_refunded": null,
        "base_shipping_discount_amount": "0.0000",
        "base_subtotal_incl_tax": "199.0000",
        "base_total_due": "0.0000",
        "shipping_discount_amount": "0.0000",
        "subtotal_incl_tax": "199.0000",
        "total_due": "0.0000",
        "increment_id": "200000423",
        "base_currency_code": "AUD",
        "discount_description": "COUPON",
        "remote_ip": "123.123.123.123",
        "store_currency_code": "AUD",
        "store_name": "Australia",
        "created_at": "2017-07-17 03:07:40",
        "shipping_incl_tax": "0.0000",
        "payment_method": "ewayrapid_ewayone",
        "gift_message_from": null,
        "gift_message_to": null,
        "gift_message_body": null,
        "tax_name": null,
        "tax_rate": null,
        "addresses": [
            {
                "region": "South Australia",
                "postcode": "5000",
                "lastname": "Doe",
                "street": "Level 6
25 Example Street",
                "city": "Adelaide",
                "email": "example@email.com",
                "telephone": "+61 123 456 789",
                "country_id": "AU",
                "firstname": "John",
                "address_type": "billing",
                "prefix": null,
                "middlename": null,
                "suffix": null,
                "company": null
            },
            {
                "region": "South Australia",
                "postcode": "5000",
                "lastname": "Doe",
                "street": "Level 6
25 Example Street",
                "city": "Adelaide",
                "email": "example@email.com",
                "telephone": "+61 123 456 789",
                "country_id": "AU",
                "firstname": "John",
                "address_type": "shipping",
                "prefix": null,
                "middlename": null,
                "suffix": null,
                "company": null
            }
        ]
    }
}

I have written the following struct types:

type Orders map[string]Order
type Order struct {
    EntityID                   string                    `json:"entity_id"`
    Status                     string                    `json:"status"`
    CouponCode                 string                    `json:"coupon_code"`
    ShippingDescription        string                    `json:"shipping_description"`
    CustomerID                 string                    `json:"customer_id"`
    BaseDiscountAmount         string                    `json:"base_discount_amount"`
    BaseGrandTotal             string                    `json:"base_grand_total"`
    BaseShippingAmount         string                    `json:"base_shipping_amount"`
    BaseShippingTaxAmount      string                    `json:"base_shipping_tax_amount"`
    BaseSubtotal               string                    `json:"base_subtotal"`
    BaseTaxAmount              string                    `json:"base_tax_amount"`
    BaseTotalPaid              string                    `json:"base_total_paid"`
    BaseTotalRefunded          string                    `json:"base_total_refunded"`
    DiscountAmount             string                    `json:"discount_amount"`
    GrandTotal                 string                    `json:"grand_total"`
    ShippingAmount             string                    `json:"shipping_amount"`
    ShippingTaxAmount          string                    `json:"shipping_tax_amount"`
    StoreToOrderRate           string                    `json:"store_to_order_rate"`
    Subtotal                   string                    `json:"subtotal"`
    TaxAmount                  string                    `json:"tax_amount"`
    TotalPaid                  string                    `json:"total_paid"`
    TotalRefunded              string                    `json:"total_refunded"`
    BaseShippingDiscountAmount string                    `json:"base_shipping_discount_amount"`
    BaseSubtotalInclTax        string                    `json:"base_subtotal_incl_tax"`
    BaseTotalDue               string                    `json:"base_total_due"`
    ShippingDiscountAmount     string                    `json:"shipping_discount_amount"`
    SubtotalInclTax            string                    `json:"subtotal_incl_tax"`
    TotalDue                   string                    `json:"total_due"`
    IncrementID                string                    `json:"increment_id"`
    BaseCurrencyCode           string                    `json:"base_currency_code"`
    DiscountDescription        string                    `json:"discount_description"`
    RemoteIP                   string                    `json:"remote_ip"`
    StoreCurrencyCode          string                    `json:"store_currency_code"`
    StoreName                  string                    `json:"store_name"`
    CreatedAt                  string                    `json:"created_at"`
    ShippingInclTax            string                    `json:"shipping_incl_tax"`
    PaymentMethod              string                    `json:"payment_method"`
    TaxName                    string                    `json:"tax_name"`
    TaxRate                    string                    `json:"tax_rate"`
    Addresses                  map[string]OrderAddresses `json:"addresses"`
}

type OrderAddresses []struct {
    Region      string  `json:"region"`
    Postcode    string  `json:"postcode"`
    Lastname    string  `json:"lastname"`
    Street      string  `json:"street"`
    City        string  `json:"city"`
    Email       string  `json:"email"`
    Telephone   string  `json:"telephone"`
    CountryID   string  `json:"country_id"`
    Firstname   string  `json:"firstname"`
    AddressType string  `json:"address_type"`
    Prefix      *string `json:"prefix"`
    Middlename  *string `json:"middlename"`
    Suffix      *string `json:"suffix"`
    Company     *string `json:"company"`
}

I am then trying to process it like so (the getFromOrdersAPI(page) function returns the JSON mentioned above in the Orders type):

for page := 1; page < 3; page++ {
    orders := getFromOrdersAPI(page)
    for _, order := range orders {
        //Process all the order items except addresses
        fmt.Println("Processing entity:", orders.EntityID)

        for _, orderaddress := range order.Addresses {
            //Trying to access address values - example below
            fmt.Println(orderaddress.Region)
        }
    }
}

When running this, I get the error:

orderaddress.Region undefined (type OrderAddresses has no field or method Region)

Where am I going wrong?

  • 写回答

2条回答 默认 最新

  • doujingtang6580 2017-08-15 04:23
    关注

    The error you are getting is due to the way you are defining your OrderAddresses struct. Instead of

    type OrderAddresses []struct {
    

    If you use

    type OrderAddresses struct {
    

    without the braces, your compile error should go away.

    That being said, I'm not sure if your json will parse as you expect given the blob I'm looking at. It appears that addresses in the json blob is an array. This means that instead of representing it as

    Addresses map[string]OrderAddresses `json:"addresses"`
    

    You should simply make it a slice of OrderAddresses

    Addresses []OrderAddresses `json:"addresses"`
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 数字电源对DSP芯片的具体要求
  • ¥20 antv g6 折线边如何变为钝角
  • ¥30 如何在Matlab或Python中 设置饼图的高度
  • ¥15 nginx中的CORS策略应该如何配置
  • ¥30 信号与系统实验:采样定理分析
  • ¥100 我想找人帮我写Python 的股票分析代码,有意请加mathtao
  • ¥20 Vite 打包的 Vue3 组件库,图标无法显示
  • ¥15 php 同步电商平台多个店铺增量订单和订单状态
  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款