gpt4 book ai didi

json - Golang 自定义解码嵌套 JSON

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:44 24 4
gpt4 key购买 nike

我有一个看起来像这样的 JSON 对象。它包含一周内每天 3 餐,共 21 个条目,因为每餐都是一个单独的条目。

{
"name": "MealPlan 1508620645147",
"items": [
{
"day": 1,
"mealPlanId": 0,
"slot": 1,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":869953,\"imageType\":\"jpg\",\"title\":\"Cream Cheese & Fruit Breakfast Pastries\"}"
},
{
"day": 1,
"mealPlanId": 0,
"slot": 2,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":537176,\"imageType\":\"jpg\",\"title\":\"Leftover Rice Casserole\"}"
},
{
"day": 1,
"mealPlanId": 0,
"slot": 3,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":595927,\"imageType\":\"jpg\",\"title\":\"Spinach and Cheddar Quiche\"}"
},
{
"day": 2,
"mealPlanId": 0,
"slot": 1,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":536716,\"imageType\":\"jpg\",\"title\":\"Candied Pecan Waffles\"}"
},
{
"day": 2,
"mealPlanId": 0,
"slot": 2,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":893265,\"imageType\":\"jpg\",\"title\":\"Tahini Date Smoothie Bowls\"}"
},
{
"day": 2,
"mealPlanId": 0,
"slot": 3,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":512880,\"imageType\":\"jpg\",\"title\":\"Grilled Caprese Salad Sandwich for #SundaySupper\"}"
},
{
"day": 3,
"mealPlanId": 0,
"slot": 1,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":648647,\"imageType\":\"jpg\",\"title\":\"Jumbo Blueberry Muffins\"}"
},
{
"day": 3,
"mealPlanId": 0,
"slot": 2,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":548554,\"imageType\":\"jpg\",\"title\":\"Brie, Pesto, and Sweet Pepper Grilled Cheese\"}"
},
{
"day": 3,
"mealPlanId": 0,
"slot": 3,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":438024,\"imageType\":\"jpg\",\"title\":\"Mother's Manicotti\"}"
},
{
"day": 4,
"mealPlanId": 0,
"slot": 1,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":681594,\"imageType\":\"jpg\",\"title\":\"Huevos Rancheros\"}"
},
{
"day": 4,
"mealPlanId": 0,
"slot": 2,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":99184,\"imageType\":\"jpg\",\"title\":\"Black Bean Tacos\"}"
},
{
"day": 4,
"mealPlanId": 0,
"slot": 3,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":604514,\"imageType\":\"jpg\",\"title\":\"Cheddar Scallion Dutch Baby\"}"
},
{
"day": 5,
"mealPlanId": 0,
"slot": 1,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":622672,\"imageType\":\"jpg\",\"title\":\"Cinnamon-Sugar Streusel Baked French Toast\"}"
},
{
"day": 5,
"mealPlanId": 0,
"slot": 2,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":636178,\"imageType\":\"jpg\",\"title\":\"Broccoli Cheddar Soup, A Panera Bread Co. Copycat\"}"
},
{
"day": 5,
"mealPlanId": 0,
"slot": 3,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":452482,\"imageType\":\"jpg\",\"title\":\"Slow Cooker Macaroni and Cheese I\"}"
},
{
"day": 6,
"mealPlanId": 0,
"slot": 1,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":157272,\"imageType\":\"jpg\",\"title\":\"Pomegranate-Nutella Waffles\"}"
},
{
"day": 6,
"mealPlanId": 0,
"slot": 2,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":619111,\"imageType\":\"jpg\",\"title\":\"Barley, Bulgur and Vegetable Vegan Casserole\"}"
},
{
"day": 6,
"mealPlanId": 0,
"slot": 3,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":510089,\"imageType\":\"jpg\",\"title\":\"Stovetop Mac and Cheese\"}"
},
{
"day": 7,
"mealPlanId": 0,
"slot": 1,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":551869,\"imageType\":\"jpg\",\"title\":\"Berry Smoothie\"}"
},
{
"day": 7,
"mealPlanId": 0,
"slot": 2,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":590452,\"imageType\":\"jpg\",\"title\":\"Cheesy Baked Pasta with Eggplant and Artichokes\"}"
},
{
"day": 7,
"mealPlanId": 0,
"slot": 3,
"position": 0,
"type": "RECIPE",
"value": "{\"id\":590452,\"imageType\":\"jpg\",\"title\":\"Cheesy Baked Pasta with Eggplant and Artichokes\"}"
}
]
}

我想将它解码为一个结构数组,每个结构将容纳 3 顿饭,分别是早餐、午餐和晚餐。所以,我希望我的结构看起来像这样,其中 IDvalue.id来自 JSON 的字段,以及 Namevalue.title来自 JSON 的字段,Breakfastslot:1 的项目,午餐是带slot:2的项目和 Dinnerslot:3 的项目.

type Day struct {
Breakfast meal
Lunch meal
Dinner meal
}

type meal struct {
ID int
Name string
}

我如何在 Go 中完成此操作?我最初的想法是创建一个中间体 struct保存来自 JSON 的所有数据,然后创建另一个 struct通过仅使用我需要的字段。我如何在不使用中介的情况下做到这一点 struct

最佳答案

按照 mayo 的建议并实现了 UnmarshalJSON

func (wp *WeekPlan) UnmarshalJSON(b []byte) error {
wp.Days = make([]Day, 7)
var f map[string]*json.RawMessage
json.Unmarshal(b, &f)

var v []map[string]interface{}
json.Unmarshal(*f["items"], &v)

for _, item := range v {

day := int(item["day"].(float64)) - 1
mealnumber := int(item["slot"].(float64))

var value map[string]interface{}
json.Unmarshal([]byte(item["value"].(string)), &value)

fmt.Println(value)

id := int(value["id"].(float64))
name := value["title"].(string)

thisMeal := Meal{ID: id, Name: name}

var dateUpdate Day

dateUpdate = wp.Days[day]

switch mealnumber {
case 1:
dateUpdate.Breakfast = thisMeal
case 2:
dateUpdate.Lunch = thisMeal
default:
dateUpdate.Dinner = thisMeal
}

wp.Days[day] = dateUpdate
}

return nil
}


type WeekPlan struct {
Days []Day
}


type Day struct {
Breakfast Meal
Lunch Meal
Dinner Meal
}


type Meal struct {
ID int
Name string
CookTime int
Image string
}

关于json - Golang 自定义解码嵌套 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46868582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com