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

报告相同问题?

悬赏问题

  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败