2013-06-20 23 views
6

Tôi muốn phân tích JSON này (trong config/synch.conf):Không thể phân tích một json phức tạp trong 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" 
} 

Với programm này:

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

} 

nào không hoạt động như mong đợi, như đầu ra là:

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

Dưới đây là ví dụ cùng một lúc play.golang.org
01.232.

Tôi không biết điều này có khả thi hay không, nhưng tôi muốn nhận giá trị của hàm json.Unmarshal được lưu trữ trong giao diện [string] {} (hoặc đối tượng khác cho phép) nơi tôi có thể truy cập , ví dụ: giá trị của phần cuối của phút (10) như sau: parsedMap["exec_period"]["end"]["minute"], nhưng tôi không biết phần "Generic JSON withinterface {}" của JSON and Go tại golang.org

Trả lời

13

Mã của bạn là tốt ngoại trừ việc json gói chỉ có thể hoạt động với các trường đã xuất.

Mọi thứ sẽ làm việc nếu bạn viết hoa chữ cái đầu tiên của mỗi field name:

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 
} 

Mặc dù có thể để marshal thành một map[string]interface{}, nếu dữ liệu có cấu trúc thiết lập (chẳng hạn như một trong câu hỏi của bạn), giải pháp của bạn có khả năng thích hợp nhất. Sử dụng giao diện {} sẽ yêu cầu xác nhận loại và có thể kết thúc tìm kiếm lộn xộn. Ví dụ của bạn sẽ trông giống như sau:

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

Thực sự, nó đơn giản sao ?! Cảm ơn bạn ANisus! –

+0

Bây giờ, câu hỏi của tôi là, làm thế nào để truy cập vào giá trị của phút cuối của exec_period? 'parsedMap [" exec_period "] [" end "] [" minute "]' không hoạt động và trả lời 'hoạt động không hợp lệ: parsedMap [" exec_period "] (chỉ mục của kiểu jason)', với các chữ cái đầu được viết hoa hoặc không –

+0

Để truy cập vào giá trị, sử dụng 'parsedMap.Exec_period.End.Minute'. Sạch hơn nhiều so với xác nhận loại giao diện! (như tôi đã thêm vào câu trả lời) – ANisus

Các vấn đề liên quan