2016-05-18 8 views
2

と一致するように:エスケープUnicode文字出力は、私はJSONをエンコードする場合、私はユニコードエスケープ文字列を取得するには、Pythonの2.7でPythonの

>>> import json 
>>> s = {"text": "三杯雞"} 
>>> print(json.dumps(s)) 

それは、この出力を与える:

{"text": "\u4e09\u676f\u96de"} 

しかし中、同様のコードを行く:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Food struct { 
    Name string `json:"name"` 
} 

func main() { 
    food := Food{Name: "三杯雞"} 
    v, _ := json.Marshal(food) 
    fmt.Println(string(v)) 
} 

はこれを与える:

{"name":"三杯雞"} 

中国語の文字はエスケープされません。私はPythonからGoにAPIエンドポイントを移植しています - どうすればPythonと同じエスケープされた出力を得ることができますか?

私はstrconv.QuoteToASCIIを使用してバリエーションを試してみましたが、彼らはUnicodeはダブルエスケープであることになる:

func main() { 
    s := strconv.QuoteToASCII("三杯雞") 
    s = strings.Trim(s, "\"") 
    food := Food{Name: s} 
    v, _ := json.Marshal(food) 
    fmt.Println(string(v)) 
} 

出力:

{"name":"\\u4e09\\u676f\\u96de"} 
+3

本当に重要ですか?両方のJSONファイルは有効で、互いに同等です。 http://ideone.com/e8Zipj –

+0

@Robᵩ良い質問ですが、おそらくそうではありません...あなたの例では、Pythonの 'json.loads'関数がそれを同等のオブジェクト表現に読み込むことしか証明していません。生のJSON文字列を印刷することで、見た目の違うものが得られます。私は、APIクライアントが表現形式を変更したことに気づかずに、内部変更のために野生のAPIクライアントを中断させたくありません。彼らは何をしているのか分かっています:) –

答えて

2

一つの解決策は、カスタムJSONの内側strconv.QuoteToASCII方法を使用することですマーシャラー:

package main 

import (
    "encoding/json" 
    "fmt" 
    "strconv" 
) 

type Food struct { 
    Name utf8String `json:"name"` 
} 

type utf8String string 

func (s utf8String) MarshalJSON() ([]byte, error) { 
    return []byte(strconv.QuoteToASCII(string(s))), nil 
} 

func main() { 
    food := Food{Name: utf8String("三杯雞")} 
    v, _ := json.Marshal(food) 
    fmt.Println(string(v)) 
} 

出力:

{"name":"\u4e09\u676f\u96de"} 

これは、構造体の定義に平野stringタイプを使用することはできませんという欠点がありますが、最終的な出力は、単にPythonでのように、ASCII-引用されています。

+0

マーシャル後に 'QuoteToASCII()'を適用するのはどうですか? –

+0

@AlexanderTrakhimenokマーシャリング後に 'QuoteToASCII()'を適用すると、JSON引用符もエスケープされます。 '' {\ "name \":\ "\ u4e09 \ u676f \ u96de \"} "' –

関連する問題