2013-06-20 7 views
6

で複雑なJSON解析できません:このプログラムの開発と私は(設定/ synch.confで)このJSONをパースしたい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" 
} 

を:

として動作しません
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
に同じ例である:出力されるように、予想さ

これはgoで可能かどうかわかりませんが、私はアクセス可能なマップ[文字列]インタフェース{}(またはそれを許可する別のオブジェクト)に格納されているjson.Unmarshal関数の値を取得したかったのですたとえば、parsedMap["exec_period"]["end"]["minute"]のような分の終わり(10)の値ですが、golang.orgの "Generic JSON withinterface {}"の部分を理解できません。

答えて

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{}にマーシャリングすることは可能ですが)、あなたの解決策が最も適しています。 interface {}を使用すると、型アサーションが必要になり、面倒なように見えるかもしれません。あなたの例は次のようになります:

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

本当に、それは簡単でしたか? ありがとうございました! –

+0

今、私の質問は、exec_periodの分の終わりの値にアクセスする方法ですか? 'parsedMap [" exec_period "] [" end "] [" minute "]'は機能しません。無効な操作:parsedMap ["exec_period"](タイプjasonのインデックス) '、最初の文字は大文字であるかどうか –

+0

To値にアクセスするには、 'parsedMap.Exec_period.End.Minute'を使います。インターフェイスタイプアサーションよりもはるかにクリーンです! (私が答えに加えたように) – ANisus

関連する問題