2016-09-07 54 views
0
找到地圖嵌套的JSON數據值

我想在地圖類型的接收使用MGO從我的MongoDB的數據[]map[string]interface{}Golang從MongoDB的

我的JSON看起來是這樣的 -

{ 
    "_id":"string", 
    "brandId":123, 
    "category":{ 
     "television":[ 
     { 
      "cat":"T1", 
      "subCategory":[ 
       { 
        "subCat":"T1A TV", 
        "warrantyPeriod":6 
       } 
      ], 
      "warrantyPeriod":12 
     }, 
     { 
      "cat":"T2", 
      "subCategory":[ 
       { 
        "subCat":"T2A", 
        "warrantyPeriod":18 
       }, 
       { 
        "subCat":"T2B", 
        "warrantyPeriod":9 
       } 
      ], 
      "warrantyPeriod":15 
     }, 
     { 
      "cat":"T3", 
      "subCategory":[ 
       { 
        "subCat":"T3A", 
        "warrantyPeriod":3 
       }, 
       { 
        "subCat":"T3B", 
        "warrantyPeriod":5 
       }, 
       { 
        "subCat":"T3C", 
        "warrantyPeriod":7 
       }, 
       { 
        "subCat":"T3D", 
        "warrantyPeriod":11 
       } 
      ], 
      "warrantyPeriod":4 
     } 
     ], 
     "television_warrantyPeriod":24 
    }, 
    "title":"BrandName" 
} 

理想情況下,我會傳入類別名稱,即'電視'和catsubCat值,這些值可以是可選的。

例如,像這樣 -

{ 
"categorySlug": "television", 
"brandId": "123", 
"model": "T2" 
} 

在這種情況下,我希望找到'15',這是T2的warrantyPeriod值,如果沒有指定T2A或T2B。

我的查詢功能這個樣子 -

var data map[string]string 
err := json.NewDecoder(r.Body).Decode(&data) 
log.Println(err) 
var buffer bytes.Buffer 
buffer.WriteString("category.") 
buffer.WriteString(data["categorySlug"]) 
brandId, _ := strconv.Atoi(data["brandId"]) 
concernedbrandandcategory := database.GetMappedFields("Brands", bson.M{"brandId": brandId, buffer.String(): bson.M{"$exists": true}}, bson.M{buffer.String(): 1}) 
categorymap := concernedbrandandcategory[0] 
log.Println(categorymap["category"]["television"], reflect.TypeOf(categorymap)) 

我GetMappedFields功能看起來是這樣的 -

func GetMappedFields(collectionName string, query interface{}, selector interface{}) (result []map[string]interface{}) { 
    MgoSession.DB(Dbname).C(collectionName).Find(query).Select(selector).All(&result) 
    return 
} 

我只是不能環繞此嵌套結構,有時會返回一個我的頭地圖,有時還有一個界面! 任何幫助將不勝感激!

回答

1

你可以做這樣的事情

majorCat := body["categorySlug"] 
    category := body["category"] 
    subCategory := body["subCategory"] 
    brandId, err := strconv.Atoi(body["brandId"]) 
    if err != nil { 
     log.Println(err) 
    } 
    result := database.GetMappedFields("Brands", bson.M{"brandId": brandId}, bson.M{"category": 1, "_id": 0}) 
    internalObj := result[0]["category"].(map[string]interface{}) 
    finalValue := internalObj["television_warrantyPeriod"] 
    if category != "" { 
     for _, v := range internalObj[majorCat].([]interface{}) { 
      subObj := v.(map[string]interface{}) 
      if subObj["cat"] == category { 
       finalValue = subObj["warrantyPeriod"] 
       if subCategory != "" { 
        minorObj := subObj["subCategory"].([]interface{}) 
        for _, iter := range minorObj { 
         kevVal := iter.(map[string]interface{}) 
         if kevVal["subCat"] == subCategory { 
          finalValue = kevVal["warrantyPeriod"] 
         } 
        } 
       } 
      } 
     } 
    } 

希望這將動態地做,或者你可以創建一個結構,以便它可以直接被解碼成歡呼

+0

真棒!這是我需要的! –