2017-10-21 210 views
-1

我有一个看起来像这样的JSON对象。它包含一周三餐,总计21项,因为每餐都是个人入场。Golang自定义解组嵌套JSON

{ 
    "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顿早餐,午餐,晚餐。所以,我想我的结构看起来像这样,在ID是从JSON的value.id领域,Name是从JSON的value.title场,Breakfastslot:1项目,午餐是slot:2Dinner的产品与项目slot:3

type Day struct { 
    Breakfast meal 
    Lunch meal 
    Dinner meal 
} 

type meal struct { 
    ID int 
    Name string 
} 

如何在Go中完成此操作?我最初的想法是创建一个中间的struct,其中包含来自JSON的所有数据,然后通过仅使用我需要的字段创建另一个struct。我怎样才能做到这一点,而不使用中介struct

+0

什么您的主要结构实现自己的执行'UnmarshalJSON'的? – mayo

+0

你是什么意思?我对Go不是很熟悉。 –

+1

你可以编写如何阅读和解析一个JSON文件到一个结构中......检查这篇文章:http://gregtrowbridge.com/golang-json-serialization-with-interfaces/ – mayo

回答

0

难道梅奥提出并实施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 
}