RubyのJSON.pretty_generate()
メソッドがUnicode文字をエスケープしないようにする方法はありますか?JSON pretty_generateがUnicodeからエスケープするのを防ぐ
次のように私は、JSONオブジェクトを持っている:
\\u0423
として
JSON.pretty_generate(my_hash)
戻り値を実行
my_hash = {"my_str" : "\u0423"};
。
この現象を防止する方法はありますか?
RubyのJSON.pretty_generate()
メソッドがUnicode文字をエスケープしないようにする方法はありますか?JSON pretty_generateがUnicodeからエスケープするのを防ぐ
次のように私は、JSONオブジェクトを持っている:
\\u0423
として
JSON.pretty_generate(my_hash)
戻り値を実行
my_hash = {"my_str" : "\u0423"};
。
この現象を防止する方法はありますか?
あなたは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_pure
(gem 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}"
・ホープ、このことができます!
通常、コーン:
ではなく、ロケット=>
を使用してハッシュを宣言します。また、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。あなたの質問に
この問題は繰り返せません。あなたがハッシュ構文を使用している場合は:あなたはルビ1.9を使用している必要があり、私がチェックしているすべての1.9.2-3は正しい答えをDNNXがここで彼の答えで言うように実行します。あなたは1.9.1を使用しているかもしれません(私はそれがうまくいったので、そのバージョンはありません)。 1.8.7は機能しません。そのための回避策はないようです。 – sunkencity