2015-07-14 8 views
6
से

मैं एक Golang HTTP अनुरोध का उपयोग इस प्रकार json उत्पादन प्राप्त करने के लिए। वेब सेवा मैं उपयोग करने के लिए कोशिश कर रहा हूँ Micrsoft अनुवादक है https://msdn.microsoft.com/en-us/library/dn876735.aspxगॉट त्रुटि "अमान्य वर्ण 'मैं' मूल्य की शुरुआत की तलाश में" json.Unmarshal

//Data struct of TransformTextResponse 
type TransformTextResponse struct { 
    ErrorCondition int `json:"ec"`  // A positive number representing an error condition 
    ErrorDescriptive string `json:"em"`  // A descriptive error message 
    Sentence   string `json:"sentence"` // transformed text 
} 


//some code .... 
body, err := ioutil.ReadAll(response.Body) 
defer response.Body.Close() 
if err != nil { 
    return "", tracerr.Wrap(err) 
} 

transTransform = TransformTextResponse{} 
err = json.Unmarshal(body, &transTransform) 
if err != nil { 
    return "", tracerr.Wrap(err) 
} 

मैं invalid character 'ï' looking for beginning of value

से एक त्रुटि मिली तो, मैं स्ट्रिंग fmt.Println(string(body)) रूप body मुद्रित करने के लिए प्रयास करते हैं, यह शो:

{"ec":0,"em":"OK","sentence":"This is too strange i just want to go home soon"} 

ऐसा लगता है डेटा किसी भी समस्या नहीं है, इसलिए मैं jason.Marshal

transTransform := TransformTextResponse{} 
transTransform.ErrorCondition = 0 
transTransform.ErrorDescriptive = "OK" 
transTransform.Sentence = "This is too strange i just want to go home soon" 
jbody, _ := json.Marshal(transTransform) 

मैंने पाया मूल डेटा समस्या हो सकती है द्वारा एक ही मूल्य बनाने की कोशिश की, तो मैं []byte प्रारूप में दो डेटा की तुलना करने की कोशिश करो। response.Body से

डाटा:

[239 187 191 123 34 101 99 34 58 48 44 34 101 109 34 58 34 79 75 34 44 34 115 101 110 116 101 110 99 101 34 58 34 84 104 105 115 32 105 115 32 116 111 111 32 115 116 114 97 110 103 101 32 105 32 106 117 115 116 32 119 97 110 116 32 116 111 32 103 111 32 104 111 109 101 32 115 111 111 110 34 125] 

से json.Marshal

[123 34 101 99 34 58 48 44 34 101 109 34 58 34 79 75 34 44 34 115 101 110 116 101 110 99 101 34 58 34 84 104 105 115 32 105 115 32 116 111 111 32 115 116 114 97 110 103 101 32 105 32 106 117 115 116 32 119 97 110 116 32 116 111 32 103 111 32 104 111 109 101 32 115 111 111 110 34 125] 

डाटा किसी भी विचार मैं इस response.Body और unmarshal यह डेटा संरचना में कैसे पार्स?

+5

यूटीएफ -8 के लिए पहले तीन बाइट [बीओएम] (https://en.wikipedia.org/wiki/Byte_order_mark) (23 9 187 1 9 1) हैं। सर्वर * नहीं * यूटीएफ -8 बीओएम शामिल करें या बाकी को संसाधित करने से पहले पहले 3 बाइट्स को टॉस करें (जो वास्तविक यूटीएफ -8 एन्कोडेड स्ट्रिंग है)। – user2864740

उत्तर

11

सर्वर आपको Byte Order Mark (BOM) के साथ एक यूटीएफ -8 टेक्स्ट स्ट्रिंग भेज रहा है। बीओएम पहचानता है कि पाठ यूटीएफ -8 एन्कोडेड है, लेकिन इसे डीकोडिंग से पहले हटा दिया जाना चाहिए।

यह निम्न पंक्ति (package "bytes" का प्रयोग करके) के साथ किया जा सकता है:

body = bytes.TrimPrefix(body, []byte("\xef\xbb\xbf")) // Or []byte{239, 187, 191} 

पी एस। ï का जिक्र करने वाली त्रुटि इसलिए है क्योंकि यूटीएफ -8 बीओएम एक आईएसओ -885 9 -1 स्ट्रिंग के रूप में व्याख्या की गई है, जो  वर्णों का उत्पादन करेगी।

+0

धन्यवाद, लेकिन यह सुनिश्चित नहीं है कि माइक्रोसॉफ्ट वेबसाइट अतिरिक्त बीओएम पहचानकर्ताओं के साथ प्रतिक्रिया क्यों देगी। –

+2

@EvanLin आपका स्वागत है :)। यह अजीब व्यवहार है। JSON चश्मा (RFC7159) स्पष्ट रूप से बताता है कि "कार्यान्वयन में बाइट ऑर्डर चिह्न नहीं जोड़ना चाहिए"। लेकिन यह भी कहता है कि डीकोडिंग कार्यान्वयन "मई को एक त्रुटि के रूप में इलाज करने के बजाए बाइट ऑर्डर मार्क की उपस्थिति को अनदेखा कर सकता है", इसलिए इसे दूर करना ठीक है। – ANisus

+4

@EvanLin "माइक्रोसॉफ्ट", यही कारण है कि। – OneOfOne

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