2017-08-15 99 views
0

我正在從包含一個或多個「實體」的API接收JSON響應。該JSON看起來是這樣的:在Go中循環嵌套的JSON元素

{ 
    "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\n25 Example Street", 
       "city": "Adelaide", 
       "email": "[email protected]", 
       "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\n25 Example Street", 
       "city": "Adelaide", 
       "email": "[email protected]", 
       "telephone": "+61 123 456 789", 
       "country_id": "AU", 
       "firstname": "John", 
       "address_type": "shipping", 
       "prefix": null, 
       "middlename": null, 
       "suffix": null, 
       "company": null 
      } 
     ] 
    } 
} 

我寫了下面的struct類型:

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"` 
} 

然後我想處理它,像這樣(的getFromOrdersAPI(page)函數返回JSON在Orders類型上述):

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

運行此,我得到的錯誤:

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

我哪裏錯了?

回答

2

你得到的錯誤是由於你定義你的OrderAddresses結構的方式。取而代之的

type OrderAddresses []struct { 

如果使用

type OrderAddresses struct { 

沒有括號,你的編譯錯誤應該消失。

這就是說,我不確定你的json是否會像你期望的那樣解析我給出的blob。看起來json blob中的addresses是一個數組。這意味着,而不是代表它作爲

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

您應該簡單地讓它的OrderAddresses

Addresses []OrderAddresses `json:"addresses"` 
+0

感謝Vikram,你的解釋幫了很大忙。我最近從PHP轉向了Go,並且仍然圍繞着它進行思考。 – James

+0

我很高興它幫助! – Vikram

1

你所得到的orderaddress.Region undefined錯誤的原因是一個切片,因爲在你的for循環的orderaddress是一個數組,根據您的OrderAddresses類型。顯然,數組沒有名爲Region的字段或方法。

如果要檢查什麼orderaddressfor循環的樣子,你可以在range像這樣:

for _, orderaddress := range order.Addresses { 
    for _, addressData := range orderaddress{ 
     fmt.Printf("%+v\n", addressData) 
    } 
} 

我已經創建了一個例子here

也就是說,在您的JSON數據中,addresses字段是一個數組,而不是地圖。因此Order結構中的Addresses字段也必須是一個數組。那麼你的OrderAddresses應該只是一個結構,而不是結構的一部分。