2011-06-27 13 views
5

RubyのJSON.pretty_generate()メソッドがUnicode文字をエスケープしないようにする方法はありますか?JSON pretty_generateがUnicodeからエスケープするのを防ぐ

次のように私は、JSONオブジェクトを持っている:

\\u0423として JSON.pretty_generate(my_hash)戻り値を実行
my_hash = {"my_str" : "\u0423"}; 

この現象を防止する方法はありますか?

+0

この問題は繰り返せません。あなたがハッシュ構文を使用している場合は:あなたはルビ1.9を使用している必要があり、私がチェックしているすべての1.9.2-3は正しい答えをDNNXがここで彼の答えで言うように実行します。あなたは1.9.1を使用しているかもしれません(私はそれがうまくいったので、そのバージョンはありません)。 1.8.7は機能しません。そのための回避策はないようです。 – sunkencity

答えて

4

あなたは6つのUnicode文字"\"、の文字列を持っている"u""0""4""2""3"my_hash = { "my_str" => '\u0423' })ではなく、1つの"У"文字からなる文字列("\u0423"、二重引用符に注意してください)。 RFC 4627によると

、段落2.5、JSON文字列にバックスラッシュ文字は、あなたがJSON.pretty_generateから二重のバックスラッシュを得る理由です、エスケープする必要があります。

また、2文字シーケンスエスケープ
いくつかの人気キャラクタの表現があります。したがって、たとえば、逆順のソリッド文字を1つだけ含む
の文字列は、「\\」としてよりコンパクトに表現された
である場合があります。

char = unescaped/
     escape (... 
      %x5C/  ; \ reverse solidus U+005C 

escape = %x5C    ; \ 

したがってJSONルビー宝石は内部でこの文字をエスケープし、JSONまたはJSON.pretty_generateをパラメータ化することによって、この動作を変更する方法はありません。

あなたはJSONの宝石の実装の詳細に興味がある場合 - それは「\」文字の明示的なマッピングと内部マッピングのハッシュを定義しています

module JSON 
    MAP = { 
     ... 
     '\\' => '\\\\' 

私はJSONの純粋なルビー色のバリエーションからこのコードを取りましたgem gem install json_puregem install jsonによって配布されるC拡張変種もあることに注意してください)。

結論:あなたはJSONのgenaration後にバックスラッシュをエスケープ解除する必要がある場合は、上記のコードのように、アプリケーションのロジックでそれを実装する必要があります。

my_hash = { "my_str" => '\u0423' } 
# => {"my_str"=>"\\u0423"} 

json = JSON.pretty_generate(my_hash) 
# => "{\n \"my_str\": \"\\\\u0423\"\n}" 

res = json.gsub "\\\\", "\\" 
# => "{\n \"my_str\": \"\\u0423\"\n}" 

・ホープ、このことができます!

2

通常、コーン:ではなく、ロケット=>を使用してハッシュを宣言します。また、1.9:my_hash = {my_str: "\u0423"}以降、シンボルキー付きハッシュの代替構文があります。この場合、:my_strが鍵になります。

とにかく、期待どおりに動作JSON.pretty_generate自分のコンピュータ上:

irb(main):002:0> my_hash = {"my_str" => "\u0423"} 
=> {"my_str"=>"У"} 
irb(main):003:0> puts JSON.pretty_generate(my_hash) 
{ 
    "my_str": "У" 
} 
=> nil 

ルビー1.9.2p290、(ビルトイン)JSON 1.4.2。あなたの質問に

関連する問題