2015-11-18 127 views
1

我想解析一個在python中生成的時間戳,併發布到這裏存儲在cassandra中,並且出現一個奇怪的錯誤。解析JSON時間錯誤

parsing time ""2015-11-05 14:14:32-0700"" as ""2006-01-02T15:04:05Z07:00"": cannot parse " 14:14:32-0700"" as "T" 

我不想修改從反正蟒蛇給我的,只是想將它傳遞直接進入卡桑德拉時間,但司機說我需要它是time.Time(不串)做所以。

下面是代碼

type OurCustomType struct { 
    TimeStamp time.Time `json:"timestamp"` 
} 


func extractJsonBody(r *http.Request) []byte { 
    body, err := ioutil.ReadAll(io.LimitReader(r.Body, 1048576)) 
    if err != nil { 
     //... 
    } 
    if err := r.Body.Close(); err != nil { 
     //.... 
    } 
    return body 
} 

func View(w http.ResponseWriter, r *http.Request) { 
    var variable OurCustomType 

    body := extractJsonBody(r) 

    if err := json.Unmarshal(body, &variable); err != nil { 
     //.. 
    } else { 
     //... 
    } 
} 

編輯:我已經實現了我自己的time.Time類型,實現了自定義UnmarshalJSON試圖解決這個問題。

type PythonTime struct { 
    time.Time 
} 

func (self *PythonTime) UnmarshalJSON(b []byte) (err error) { 
    self.Time, err = time.Parse("2006-01-02 15:04:05-0700", string(b)) 
    return 
} 

但我沒有得到這個錯誤:

parsing time ""2015-11-05 14:14:32-0700"" as "2006-01-02 15:04:05-0700": cannot parse ""2015-11-05 14:14:32-0700"" as "2006" 
+1

時間類需要一個格式字符串,在你的情況下它會是'2006-01-02 15:04:05-0700'。我相信你不能直接提供給unmashaller,所以你必須爲你的類型實現'UnmarshalJSON'來在那裏處理它,或者解組成一個字符串並在稍後轉換它。更多關於格式字符串的東西在這裏; http://stackoverflow.com/questions/25845172/parsing-date-string-in-golang這裏是一個示例實現MarshalJSON,你需要做的是類似的,只是爲了解組http://stackoverflow.com/questions/20475321/override-layout-by-json-marshal-to-format-time-time – evanmcdonnal

+0

@evanmcdonnal感謝您的評論,這讓我非常接近,但我仍然收到一個我不確定的錯誤。查看最近的編輯 – electrometro

+0

我不確定如何幫助你。我在這裏做了一個快速測試https://play.golang.org/p/fZ7soeHJhj,它應該工作。我通常建議在這裏打印/檢查'string(b)'的值,因爲某些原因格式不匹配,但是錯誤使得它看起來像'string(b)'正在產生期望值。 – evanmcdonnal

回答

0

這裏的問題是,你有在日報價從Python的傳遞。

在您發佈的第一個錯誤中,您可以看到它在閱讀"T"時失敗。這是因爲你在Go中使用的格式不同於你從Python返回的格式。

parsing time ""2015-11-05 14:14:32-0700"" as ""2006-01-02T15:04:05Z07:00"": cannot parse " 14:14:32-0700"" as "T" 

您使用""2006-01-02T15:04:05Z07:00""當從Python的格式是""2006-01-02 15:04:05-0700""

在上次錯誤中也是如此,不同之處在於您刪除了日期格式中的一對引號和您在Python中返回的引用。

parsing time ""2015-11-05 14:14:32-0700"" as "2006-01-02 15:04:05-0700": cannot parse ""2015-11-05 14:14:32-0700"" as "2006" 

這是說,你提供"2006-01-02 15:04:05-0700"但它預計""2006-01-02 15:04:05-0700""由於被Python返回的日期額外的報價。