2013-06-20 8 views
6

मैं इस JSON पार्स करने के लिए चाहते हैं (config/synch.conf में) पार्स करने में अक्षम:golang में एक जटिल json

{ 
    "period" :"yy", 
    "exec_period" : 
     { 
      "start" : { 
       "month" : 1, 
       "week" : 2, 
       "day" : 3, 
       "hour" : 4, 
       "minute" : 5 
      }, 
      "end" : { 
       "month" : 6, 
       "week" : 7, 
       "day" : 8, 
       "hour" : 9, 
       "minute" : 10 
      } 
     }, 
    "backup" : [ 
     { 
      "local_dir" : "directoryLo1", 
      "server_dir" : "directoryLo2", 
      "server_host" : "domaineName" 
     }, 
     { 
      "local_dir" : "directoryLo1", 
      "server_dir" : "directorySe2", 
      "server_host" : "domaineName" 
     } 
    ], 
    "incremental_save" : "1Y2M" 
} 

इस programm के साथ:

package main 

import (
    "encoding/json" 
    "fmt" 
    "io/ioutil" 
) 

func main() { 
    content, err := ioutil.ReadFile("config/synch.conf") 
    if err == nil { 

     type date struct{ 
      month float64 
      week float64 
      day float64 
      hour float64 
      minute float64 
     } 

     type period struct{ 
      start date 
      end date 
     } 

     type backupType []struct{ 
      local_dir string 
      server_dir string 
      server_host string 
     } 

     type jason struct{ 
      period string 
      exec_period period 
      backup backupType 
      incremental_save string 
     } 

     var parsedMap jason 

     err := json.Unmarshal(content, &parsedMap) 

     if err!= nil { 
      fmt.Println(err) 
     } 

     fmt.Println(parsedMap) 
    } else { 
     panic(err) 
    } 

} 

कौन सा रूप में काम नहीं करता है उम्मीद है, के रूप में उत्पादन होता है:

{ {{0 0 0 0 0} {0 0 0 0 0}} [] } 

यहाँ play.golang.org में एक ही उदाहरण है
01,232,

मुझे नहीं पता कि यह संभव है या नहीं, लेकिन मैं नक्शा [स्ट्रिंग] इंटरफ़ेस {} में संग्रहीत json.Unmarshal फ़ंक्शन का मूल्य प्राप्त करना चाहता था (या कोई अन्य ऑब्जेक्ट जो इसे अनुमति देता है) जहां मैं पहुंच सकता था उदाहरण के लिए, मिनट के अंत (10) इस तरह के मूल्य: parsedMap["exec_period"]["end"]["minute"], लेकिन मैं golang.org में "सामान्य JSON withinterface {}" JSON and Go का हिस्सा uderstand नहीं है

उत्तर

13

आपका कोड सिवाय इसके कि ठीक है json पैकेज केवल निर्यात किए गए फ़ील्ड के साथ काम कर सकता है। यदि आप प्रत्येक फ़ील्ड नाम के लिए पहले अक्षर को कैपिटल

सब कुछ काम करेंगे:

type date struct { 
    Month float64 
    Week float64 
    Day float64 
    Hour float64 
    Minute float64 
} 

type period struct { 
    Start date 
    End date 
} 

type backupType []struct { 
    Local_dir string 
    Server_dir string 
    Server_host string 
} 

type jason struct { 
    Period   string 
    Exec_period  period 
    Backup   backupType 
    Incremental_save string 
} 

हालांकि यह अगर डेटा एक सेट संरचना (जैसे आपका प्रश्न में एक के रूप में है एक map[string]interface{} में मार्शल करने के लिए संभव है,), आपका समाधान सबसे अधिक संभावना है। इंटरफ़ेस {} का उपयोग करने के लिए प्रकार के दावों की आवश्यकता होगी और गन्दा दिखने लग सकते हैं। आपका उदाहरण इस तरह दिखेगा:

parsedMap["exec_period"].(map[string]interface{})["end"].(map[string]interface{})["minute"].(float64) 
+0

वास्तव में, क्या यह इतना आसान था ?! धन्यवाद एनीसस! –

+0

अब, मेरा सवाल है, exec_period के मिनट के अंत के मूल्य तक कैसे पहुंचे? 'parsedMap [" exec_period "] [" end "] [" minute "] 'काम नहीं करता है और अमान्य ऑपरेशन का जवाब देता है: पार्सडैप [" exec_period "] (प्रकार जेसन का सूचकांक)', पहले अक्षरों को पूंजीकृत या –

+0

नहीं मान का उपयोग करें, 'parsedMap.Exec_period.End.Minute' का उपयोग करें। अंतरफलक प्रकार के दावे के मुकाबले ज्यादा क्लीनर! (जैसा कि मैंने उत्तर में जोड़ा है) – ANisus