Я извлекаю и декодирую большой ответ JSON, в котором есть ошибка. Теперь мне нужно найти , где ошибка есть! Я read about json.SyntaxError, но я изо всех сил пытаюсь выяснить, как его использовать.Отладка ошибки JSON от Golang
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
Но мне нужно что-то вроде этого в моем STDERR к лучше отладить выпуск:
Line 8: published_at is invalid
И, возможно, некоторые контекст Заголовок, так что я могу сказать API Бэкэнд-команда у них есть ошибка в ответе JSON.
БОНУС вопрос: Кроме того, я не хочу, чтобы напечатать значение 0001-01-01 00:00:00 +0000 UTC, как это на самом деле очень пусто. На самом деле я не возражаю против того, чтобы его не хватало.
Сообщение об ошибке указывает, где именно находится ошибка. * parsing time "" null "" as "" 2006-01-02T15: 04: 05Z07: 00 "": не удается разобрать «null» «как« 2006 »*. В вашем теле JSON вы набрали нуль как строку («null») .Попробуйте удалить кавычки вокруг него. – Nadh
Я знаю, что там есть ошибка, потому что я его там помещал. Мой вопрос спрашивает, как печатать, где произошла ошибка. – hendry
Вы пробовали 'json.unmarshal() 'function? Он возвращает ошибку, если есть какие-либо возможности, которые могут вам помочь, см. [https://play.golang.org/p/eQCG-RE5sK](https://play.golang.org/p/eQCG-RE5sK) – tgogos