2015-11-24 3 views
10

docs से:गोलांग के जेसन का क्या कारण होगा। मार्शल एक त्रुटि वापस करने के लिए?

JSON चक्रीय डाटा संरचनाओं का प्रतिनिधित्व नहीं कर सकते हैं और मार्शल उन्हें संभाल नहीं करता है। मार्शल के लिए चक्रीय संरचनाओं को पारित करने के परिणामस्वरूप अनंत पुनरावृत्ति होगी।

मैंने इस स्थिति का अनुभव किया है, जिसके परिणामस्वरूप रनटाइम आतंक होता है।

मुझे क्या सोच रहा है कि कोई भी एक ऐसा कामकाजी प्रोग्राम प्रदान कर सकता है जो गैर-आतंक की स्थिति का प्रदर्शन करता है जहां जेसन। मार्शल एक गैर-शून्य त्रुटि देता है। सबसे अच्छे उत्तर में का उपयोग किए गए इनपुट शामिल हैं।

+1

मैं क्योंकि मेरा मानना ​​है कि आप newtonsoft के json.NET पुस्तकालय में 'PreserveReferencesHandling' की तरह एक सुविधा के लिए देख रहे (सी #) अपने प्रश्न थोड़ा संशोधन की सलाह देते हैं लेकिन, मैं सही ढंग से की तरह कुछ unmarshalling द्वारा आपके प्रश्न का उत्तर सकता है' {"नाम": "ईवान", "आयु": 26} 'क्योंकि आपके प्रश्न का अंतिम अनुच्छेद बहुत विशिष्ट नहीं है। उस उद्धरण से, ऐसा लगता है कि आपको अपने प्रकार के लिए 'UnmarshalJSON' को लागू करने की आवश्यकता है। स्पष्ट होने के लिए, आप इसे गो में करना चाहते हैं; http://stackoverflow.com/questions/17818386/how-to-serialize-as-json-an-object-structure-with-circular-references – evanmcdonnal

+3

मार्शल एक प्रकार जो जेसन लागू करता है। मार्शलर अपनी मार्शल जेसन विधि और त्रुटियों को लाकर हमेशा। मृत सरल बिल्कुल कोई इनपुट उपयोग नहीं किया जाता है। – Volker

+0

हां, धन्यवाद @ वोल्कर - यही वह है जो मुझे करना चाहिए था। #facepalm – mdwhatcott

उत्तर

8

अपडेट: अब त्रुटि


गो-विशिष्ट संरचनाओं प्रकाश में लाना, उदा एक नक्शा [int] पूर्णांक के बजाय एक चैनल का उपयोग। func या chan क्रमानुसार करने से मना:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

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

बस जोनाथन के जवाब के पूरक हैं, json.Marshal समारोह दो प्रकार की त्रुटियां लौट सकते हैं करने के लिए:, UnsupportedTypeError या UnsupportedValueError

पहले एक कारण हो सकता है के रूप में जोनाथन ने कहा अमान्य प्रकार का मार्शल की कोशिश कर रहा:

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

दूसरी ओर आप भी मार्शल समारोह में अमान्य मान पारित करके एक त्रुटि वापसी हो सकती है:

_, err := json.Marshal(math.Inf(1)) 
_, ok := err.(*json.UnsupportedValueError) // ok == true 
संबंधित मुद्दे

 संबंधित मुद्दे