Парсинг JSON GoLang в структуру с динамическим ключем
Есть вот такой JSON файл:
{
"exemple.ru:nickname:MOBILE": {
"id": "ID:nickname:MOBILE",
"type": "SHOP",
"meta": {
"status": "failed",
"restricted": false,
"domain": "touchmehome.ru",
"comments": [],
"deviceType": "MOBILE"
},
"attributes": {
"category": "123",
"currency": "123",
"isbn": "123",
"name": "123",
"pictures": "123",
"price": "123",
"vendor": "123"
},
"cart": {
"currency": "",
"multiplyItemsPrice": false,
"prices": "",
"quantities": "",
"titles": "",
"totalPrices": "",
"urlTemplate": ""
},
"checkout": {
"placeOrderBtn": "",
"urlTemplate": ""
},
"mainPageTemplates": [],
"productPageSelector": "",
"urlTemplate": []
}
}
Есть код в GoLang (select.go):
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
)
type All struct {
AttributesAll []AttributesAll `json:"attributes"`
CartAll []CartAll `json:"cart"`
CheckOutAll []CheckOutAll `json:"checkout"`
ProductPageSelector []string `json:"productPageSelector"`
UrlTemplates []string `json:"urlTemplates"`
}
type AttributesAll struct {
Category string `json:"category"`
Currency string `json:"currency"`
Isbn string `json:"isbn"`
Name string `json:"name"`
Pictures string `json:"pictures"`
Price string `json:"price"`
Vendor string `json:"vendor"`
}
type CartAll struct {
Currency string `json:"currency"`
Prices string `json:"prices"`
Quantities string `json:"quantities"`
Titles string `json:"titles"`
TotalPrices string `json:"totalPrices"`
UrlTemplate string `json:"urlTemplate"`
}
type CheckOutAll struct {
PlaceOrderBtn string `json:"placeOrderBtn"`
UrlTemplate string `json:"urlTemplate"`
}
func (AllSelectors *All) getAllSelectors(){
//var err error
fileWithSelectors, err := ioutil.ReadFile("selectors.json")
if err != nil {
log.Fatal(err)
}
//fmt.Println(fileWithSelectors)
var m All
err = json.Unmarshal(fileWithSelectors, &m)
if err != nil {
log.Fatal(err)
}
fmt.Println(m)
}
app.go
package main
var c All
func main() {
c.getAllSelectors()
}
В ответе приходит вот это:
&{[] [] [] [] []}
Помогите пожалуйста разобраться в чем проблема
Ответы (1 шт):
Автор решения: Senior Pomidor
→ Ссылка
динамические объекты такого рода можно перебирать как map[string]interface{}, но в вашем конкретном случае мы не знаем только первый уровень, а остальное описано, поэтому нам нужно описать map[string]All
Но также структура All описано неверно. Поля структуры не должны быть массивом.
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
)
type All struct {
AttributesAll AttributesAll `json:"attributes"`
CartAll CartAll `json:"cart"`
CheckOutAll CheckOutAll `json:"checkout"`
ProductPageSelector string `json:"productPageSelector"`
UrlTemplates string `json:"urlTemplates"`
}
type AttributesAll struct {
Category string `json:"category"`
Currency string `json:"currency"`
Isbn string `json:"isbn"`
Name string `json:"name"`
Pictures string `json:"pictures"`
Price string `json:"price"`
Vendor string `json:"vendor"`
}
type CartAll struct {
Currency string `json:"currency"`
Prices string `json:"prices"`
Quantities string `json:"quantities"`
Titles string `json:"titles"`
TotalPrices string `json:"totalPrices"`
UrlTemplate string `json:"urlTemplate"`
}
type CheckOutAll struct {
PlaceOrderBtn string `json:"placeOrderBtn"`
UrlTemplate string `json:"urlTemplate"`
}
func (AllSelectors *All) getAllSelectors(){
//var err error
fileWithSelectors, err := ioutil.ReadFile("j.json")
if err != nil {
log.Fatal(err)
}
// fmt.Println(string(fileWithSelectors))
var m map[string]All
err = json.Unmarshal(fileWithSelectors, &m)
if err != nil {
log.Fatal(err)
}
fmt.Println(fmt.Sprintf("the full data \n%+v", m))
for _, all := range m {
fmt.Println(fmt.Sprintf("attributes \n%+v", all.AttributesAll))
}
}
var c All
func main() {
c.getAllSelectors()
}
вывод
the full data
map[exemple.ru:nickname:MOBILE:{AttributesAll:{Category:123 Currency:123 Isbn:123 Name:123 Pictures:123 Price:123 Vendor:123} CartAll:{Currency: Prices: Quantities: Titles: TotalPrices: UrlTemplate:} CheckOutAll:{PlaceOrderBtn: UrlTemplate:} ProductPageSelector: UrlTemplates:}]
attributes
{Category:123 Currency:123 Isbn:123 Name:123 Pictures:123 Price:123 Vendor:123}