我正在读取并解码其中有错误的大型JSON响应。现在我需要找到其中的错误是!我read about json.SyntaxError但我努力找出如何使用它。从Golang调试JSON错误
package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
"text/template"
"time"
)
type Movie struct {
Title string `json:"title"`
PublishedAt time.Time `json:"published_at"`
}
func main() {
req, _ := http.NewRequest("GET", "https://s.natalian.org/2016-12-07/debugme2.json", nil)
resp, err := http.DefaultClient.Do(req)
defer resp.Body.Close()
dec := json.NewDecoder(resp.Body)
_, err = dec.Token()
for dec.More() {
var m Movie
if err = dec.Decode(&m); err != nil {
fmt.Println(err)
fmt.Println("Bad", m)
// https://blog.golang.org/error-handling-and-go
if serr, ok := err.(*json.SyntaxError); ok {
fmt.Println("Syntax error", serr)
}
} else {
fmt.Println("Good", m)
}
tmpl := template.Must(template.New("test").Parse("OUTPUT: {{ if .Title }}{{.Title}}{{ if .PublishedAt }} was published at {{.PublishedAt}} {{ end }}{{end}}\n"))
tmpl.Execute(os.Stdout, m)
}
}
我在想什么?任何工具或策略或建议将不胜感激。我的输出目前的样子:
Good {foobar 2016-11-24 16:17:12 +0800 SGT}
OUTPUT: foobar was published at 2016-11-24 16:17:12 +0800 SGT
parsing time ""null"" as ""2006-01-02T15:04:05Z07:00"": cannot parse "null"" as "2006"
Bad {barbar 0001-01-01 00:00:00 +0000 UTC}
OUTPUT: barbar was published at 0001-01-01 00:00:00 +0000 UTC
Good { 1999-12-24 16:11:12 +0200 +0200}
OUTPUT:
Good {Something else entirely 2000-01-24 16:11:12 +0200 +0200}
OUTPUT: Something else entirely was published at 2000-01-24 16:11:12 +0200 +0200
但我需要这样的事情在我的错误输出到更好的调试问题:
Line 8: published_at is invalid
等的标题也许有些情况下,所以我可以告诉API后端团队在他们的JSON响应中出现错误。
奖金问题:而且我不希望打印的价值0001-01-01 00:00:00 +0000 UTC因为它居然真的空。我并不介意它错过了。
错误消息确切地告诉错误在哪里。 *解析时间“”null“”as“”2006-01-02T15:04:05Z07:00“”:无法解析“null”为“2006”*。在您的JSON正文中,您已将null键入为字符串(“null”)。尝试删除引号。 – Nadh
我知道有一个错误,因为我把它放在那里。我的问题是问如何打印错误发生的地方。 – hendry
你试过'json.unmarshal() '函数?如果有任何可以帮助你的函数,它会返回错误,请参见[https://play.golang.org/p/eQCG-RE5sK](https://play.golang.org/p/eQCG-RE5sK ) – tgogos