2017-02-21 32 views
0

我用net/http請求一個web API並且服務器返回了一個JSON響應。當我打印響應正文時,它顯示爲原始ASCII內容。我嘗試使用bufio.ScanRunes解析內容但失敗。如何讓原始的unicode編碼內容可讀?

我也嘗試寫一個簡單的服務器,並返回一個Unicode字符串,它運作良好。

這裏是核心代碼:

func (c ClientInfo) Request(method string, url string, form url.Values) string { 
    req, _ := http.NewRequest(method, url, strings.NewReader(c.Encode(form))) 
    req.Header = c.Header 
    req.AddCookie(&c.Cookie) 
    resp, err := http.DefaultClient.Do(req) 
    defer resp.Body.Close() 
    if err != nil { 
     fmt.Println(err) 
    } 

    scanner := bufio.NewScanner(resp.Body) 
    scanner.Split(bufio.ScanRunes) 

    var buf bytes.Buffer 
    for scanner.Scan() { 
     buf.WriteString(scanner.Text()) 
    } 
    rv := buf.String() 
    fmt.Println(rv) 
    return rv 
} 

下面是示例輸出:

{ 「論壇」:{ 「ID」: 「3251718」, 「名」:「\ u5408 \ u80a5 \ u5de5 \ u4e1a \ u5927 \ u5b66 \ u5ba3 \ u57ce \ u6821 \ u533a」, 「first_class」: 「\ u9ad8 \ u7b49 \ u9662 \ u6821」, 「second_class」: 「\ u5b89 \ u5fbd \ u9662 \ u6821」 「is_like」: 「0」, 「user_level」: 「1」, 「level_id」: 「1」, 「level_name」: 「\ u7d20 \ u672a \ u8c0b \ u9762」, 「cur_score」: 「0」, 「levelup_score」 : 「5」, 「member_num」: 「80329」, 「is_exists」: 「1」, 「thread_num」: 「108762」, 「post_num」: 「3445881」, 「good_classify」:[{ 「類標識碼」: 「0」 「CLASS_NAME」:「\ u5168 \ü 90e8 「},{」 類標識碼 「:」 1" , 「CLASS_NAME」: 「\ u516c \ u544a \ u7c7b」},{ 「類標識碼」: 「2」, 「CLASS_NAME」: 「\ u5427 \ u53cb \ u4e13 \ u533a」 },{ 「類標識碼」: 「4」, 「CLASS_NAME」: 「\ u6d3b \ u52a8 \ u4e13 \ u533a」},{ 「類標識碼」: 「6」, 「CLASS_NAME」: 「\ u793e \ u56e2 \ u73ed \ u7ea7」 },{ 「類標識碼」: 「5」, 「CLASS_NAME」: 「\ u8d44 \ u6e90 \ u5171 \ u4eab」},{ 「類標識碼」: 「8」, 「CLASS_NAME」:「\ u6e29 \ u99a8 \ u751f \ u6d3b \ u7c7b 「},{」 類標識碼 「:」 7" , 「CLASS_NAME」: 「\ u54a8 \ u8be2 \ u65b0 \ u95fb \ u7c7b」},{ 「類標識碼」: 「3」, 「CLASS_NAME」:「\ u98ce \ u91c7 \管理員「:[{」id「:」793092593「,」name「:」yi \ u62b9 \ u9a9a \ u7684 \ u5fe7 \ u4f24「},

.. 。

回答

1

這只是轉義任何Unicode字符的標準方法。

解組也看到了未加引號的文本(json包將解除引用它):

func main() { 
    var i interface{} 
    err := json.Unmarshal([]byte(src), &i) 
    fmt.Println(err, i) 
} 

const src = `{"forum":{"id":"3251718","name":"\u5408\u80a5\u5de5\u4e1a\u5927\u5b66\u5ba3\u57ce\u6821\u533a","first_class":"\u9ad8\u7b49\u9662\u6821","second_class":"\u5b89\u5fbd\u9662\u6821","is_like":"0","user_level":"1","level_id":"1","level_name":"\u7d20\u672a\u8c0b\u9762","cur_score":"0","levelup_score":"5","member_num":"80329","is_exists":"1","thread_num":"108762","post_num":"3445881","good_classify":[{"class_id":"0","class_name":"\u5168\u90e8"},{"class_id":"1","class_name":"\u516c\u544a\u7c7b"},{"class_id":"2","class_name":"\u5427\u53cb\u4e13\u533a"},{"class_id":"4","class_name":"\u6d3b\u52a8\u4e13\u533a"},{"class_id":"6","class_name":"\u793e\u56e2\u73ed\u7ea7"},{"class_id":"5","class_name":"\u8d44\u6e90\u5171\u4eab"},{"class_id":"8","class_name":"\u6e29\u99a8\u751f\u6d3b\u7c7b"},{"class_id":"7","class_name":"\u54a8\u8be2\u65b0\u95fb\u7c7b"},{"class_id":"3","class_name":"\u98ce\u91c7\u5c55\u793a\u533a"}]}}` 

輸出(修整)(嘗試在Go Playground):

<nil> map[forum:map[levelup_score:5 is_exists:1 post_num:3445881 good_classify:[map[class_id:0 class_name:全部] map[class_id:1 class_name:公告類] map[class_id:2 class_name:吧友專區] map[class_id:4 class_name:活動專區] map[class_id:6 class_name:社團班級] map[class_id:5 class_name:資源共享] map[class_id:8 class_name:溫馨生活類] map[class_name:諮詢新聞類 class_id:7] map[class_id:3 class_name:風采展示區]] id:3251718 is_like:0 cur_score:0

如果您只想取消一個片段,您可以使用strconv.Unquote()

fmt.Println(strconv.Unquote(`"\u7d20\u672a\u8c0b"`)) 

輸出(嘗試在Go Playground):

素未謀 <nil> 

注意strconv.Unquote()期望一個string是在引號,這就是爲什麼我用原始字符串字面量,這樣我就可以添加引號,也使編譯器本身不會解釋/取消引用Unicode轉義。

查看相關問題:How to convert escape characters in HTML tags?

+0

感謝您的回答。 – earlzo

相關問題