2015-11-24 3 views
10

Vom docs:Welche Eingabe wird dazu führen, dass golang's json.Marshal einen Fehler zurückgibt?

JSON darstellen können nicht zyklische Datenstrukturen und Marshal sie nicht handhaben. Das Übergeben zyklischer Strukturen an Marshal führt zu einer unendlichen Rekursion.

Ich habe diese Situation erlebt, die in einer Laufzeitpanik resultiert.

Was ich frage mich ist, wenn jemand ein Arbeitsprogramm zur Verfügung stellen kann, das eine Nicht-Panik-Situation zeigt, wo json.Marshal einen Nicht-Null-Fehler zurückgibt. Die besten Antworten würden eindeutig die verwendeten Eingänge enthalten.

+1

würde ich empfehlen, Ihre Frage etwas revidieren, weil ich Sie suchen ein Feature wie 'PreserveReferencesHandling' in newtonsoft der json.NET Bibliothek (C#) jedoch glauben, könnte ich deine Frage richtig beantworten, indem sie wie etwas unmarshalling' {"name": "evan", "age": 26} 'weil der letzte Absatz Ihrer Frage nicht sehr spezifisch ist. Aus diesem Zitat klingt es so, als müssten Sie "UnmarshalJSON" für Ihren Typ implementieren. Um es klar zu sagen, du willst das in Go machen; http://stackoverflow.com/questions/17818386/how-to-serialize-as-json-an-object-structure-with-circular-references – evanmcdonnal

+3

Marshal ein Typ, der json.Marshaler implementiert, indem er seine eigene MarshalJSON-Methode und Fehler bringt immer. Tot einfach. Absolut keine Eingabe (n) verwendet. – Volker

+0

Ja, danke @Volker - das hätte ich machen sollen. #facepalm – mdwhatcott

Antwort

8

Update: jetzt einen Kanal statt einer Karte [int] int mit dem Fehler


Go-spezifische Strukturen, beispiel zu entlocken. func oder chan verweigern serialisiert:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

func main() { 
    value := make(chan int) 
    _, err := json.Marshal(value) 
    fmt.Println(err) 
} 
10

Nur Jonathan Antwort zu ergänzen, kann die json.Marshal Funktion zwei Arten von Fehlern zurück: UnsupportedTypeError oder UnsupportedValueError

Die erste verursacht werden können, wie Jonathan sagte von versucht, einen ungültigen Typ Marshal:

_, err := json.Marshal(make(chan int)) 
_, ok := err.(*json.UnsupportedTypeError) // ok == true 

auf der anderen Seite können Sie auch die Marshal-Funktion einen Fehler zurück, durch einen ungültigen Wert übergeben:

_, err := json.Marshal(math.Inf(1)) 
_, ok := err.(*json.UnsupportedValueError) // ok == true 
Verwandte Themen