2014-04-23 16 views
6

Tôi có đoạn mã sau để thử Unmarshal file json này, tuy nhiên dòng json.Unmarshal ([] byte (msg ["restaurant"]), & restaurant) luôn đưa ra một lỗi. Làm thế nào tôi có thể làm cho Unmarshal bỏ qua "nhà hàng" hoặc chỉ truyền dữ liệu "nhà hàng" cho hàm Unmarshal?golang json unmarshal một phần của bản đồ [string] interface {}

Cảm ơn!

{ 
    "restaurant": { 
    "name": "Tickets", 
    "owner": { 
     "name": "Ferran" 
    } 
    } 
} 


    file, e := ioutil.ReadFile("./rest_read.json") 
    if e != nil { 
      fmt.Println("file error") 
      os.Exit(1) 
    } 

    var data interface{} 
    json.Unmarshal(file, &data) 

    msg := data.(map[string]interface{}) 
    log.Println(msg) 
    log.Println(msg["restaurant"]) 
    log.Println(reflect.TypeOf(msg["restaurant"])) 

    var restaurant Restaurant 
    json.Unmarshal([]byte(msg["restaurant"]), &restaurant) 

    log.Println("RName: ", restaurant.Name) 
    log.Println("Name: ", restaurant.Owner.Name) 

Trả lời

8

Tôi sẽ đề xuất xây dựng mô hình phù hợp cho dữ liệu của bạn. Điều này sẽ cho phép bạn xóa sạch dữ liệu của bạn thành một cấu trúc Go.

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Restaurant struct { 
    Restaurant RestaurantData `json:"restaurant"` 
} 

type RestaurantData struct { 
    Name string `json:"name"` 
    Owner Owner `json:"owner"` 
} 

type Owner struct { 
    Name string `json:"name"` 
} 

func main() { 
    data := `{"restaurant":{"name":"Tickets","owner":{"name":"Ferran"}}}` 
    r := Restaurant{} 
    json.Unmarshal([]byte(data), &r) 

    fmt.Printf("%+v", r) 
} 
1

unmarshalling xảy ra một cách đệ quy, vì vậy msg["restaurant"] không còn là một chuỗi json - đó là map[string]interface{} khác. Nếu bạn muốn unmarshall trực tiếp vào một đối tượng Restaurant, bạn sẽ phải cung cấp một đối tượng wrapper đơn giản với một thành viên Restaurant và unmarshall vào đó.

9

Có thể làm unmarshalling generic ala gson bằng cách giải mã thành một giao diện và sau đó giải nén bản đồ trên mức từ kết quả, ví dụ:

var msgMapTemplate interface{} 
err := json.Unmarshal([]byte(t.ResponseBody), &msgMapTemplate) 
t.AssertEqual(err, nil) 
msgMap := msgMapTemplate.(map[string]interface{}) 

Xem "giải mã dữ liệu tùy ý" trong http://blog.golang.org/json-and-go cho nhiều hơn vào.

+0

Câu trả lời hay! Đôi khi làm cho một mô hình để làm Unmarshalling nghiêm ngặt là một nỗi đau. – Civilian

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