2013-06-20 17 views
6

chcę przeanalizować ten JSON (w config/synch.conf):Nie można przeanalizować złożoną json w golang

{ 
    "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" 
} 

Z tego programowo:

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) 
    } 

} 

który nie działa jak Oczekuje, a wyjście jest:

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

Oto sam przykład w play.golang.org
http://play.golang.org/p/XoMJIDIV59

Nie wiem, czy jest to możliwe z go, ale chciałem uzyskać wartość funkcji json.Unmarshal zapisaną w interfejsie [string] mapy {} (lub innym obiekcie, który to umożliwia), gdzie mogłem uzyskać dostęp na przykład wartość końca minuty (10) w następujący sposób: parsedMap["exec_period"]["end"]["minute"], ale nie rozumiem sekcji "Ogólne JSON wewnątrz {}" części JSON and Go pod adresem golang.org

Odpowiedz

13

Twój kod jest w porządku, oprócz tego, że json pakiet może działać tylko z wyeksportowanymi polami.

Wszystko będzie działać, jeśli pierwszą literę każdego Nazwa pola:

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 
} 

Choć możliwe jest, aby zebrać do map[string]interface{}, jeśli dane ma strukturę zestaw (taki jak ten w swoim pytaniu), twoje rozwiązanie jest najprawdopodobniej lepsze. Używanie interfejsu {} wymagałoby asercji typu i może się wydawać nieprzyjemne. Twój przykład będzie wyglądał tak:

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

Naprawdę, było to takie proste ?! Dziękuję ANISUS! –

+0

Teraz moje pytanie brzmi: jak uzyskać dostęp do wartości końca minutowego exec_period? 'parsedMap [" exec_period "] [" end "] [" minute "]' nie działa i odpowiada 'niepoprawna operacja: parsedMap [" exec_period "] (indeks typu jason)', z pierwszą literą wielką lub nie –

+0

To uzyskać dostęp do wartości, użyj 'parsedMap.Exec_period.End.Minute'. Znacznie czystsze niż z asercją typu interfejsu! (jak dodałem do odpowiedzi) – ANisus

Powiązane problemy