2011-06-27 19 views
5

से बचने से JSON pretty_generate को रोकें क्या रूबी की JSON.pretty_generate() विधि को यूनिकोड वर्ण से बचने से रोकने का कोई तरीका है?यूनिकोड

my_hash = {"my_str" : "\u0423"}; 

JSON.pretty_generate(my_hash) रिटर्न \\u0423 होने के रूप में मूल्य चल रहा है:

मैं इस प्रकार एक JSON वस्तु है।

क्या इस व्यवहार को रोकने के लिए कोई रास्ता है?

+0

मैं इस समस्या को दोहराना नहीं कर सकता। यदि आप हैश सिंटैक्स का उपयोग कर रहे हैं: आपको रूबी 1.9 का उपयोग करना होगा, और सभी 1.9.2-3 का मैं सही तरीके से जांच करूँगा क्योंकि डीएनएनएक्स यहां उनके जवाब में कहता है। आप 1.9.1 का उपयोग कर रहे हैं हालांकि (मेरे पास वह संस्करण नहीं है क्योंकि यह कभी भी अच्छा काम नहीं करता है)। 1.8.7 काम नहीं करता है, और इसके लिए कोई कामकाज नहीं लगता है। – sunkencity

उत्तर

4

अपने प्रश्न में आप 6 यूनिकोड वर्ण "\", के एक स्ट्रिंग है "u", "0", "4", "2", "3" (my_hash = { "my_str" => '\u0423' }), न कोई स्ट्रिंग 1 "У" चरित्र से मिलकर ("\u0423", ध्यान दें दोहरे उद्धरण चिह्नों)।

RFC 4627, पैरा 2.5, JSON स्ट्रिंग में बैकस्लैश चरित्र भाग निकले किया जाना चाहिए के अनुसार, इस वजह से आपके JSON.pretty_generate से डबल बैकस्लैश मिलता है।

वैकल्पिक रूप से, वहाँ दो चरित्र अनुक्रम से बचने के कुछ लोकप्रिय पात्रों में से
निरूपण कर रहे हैं। इसलिए, उदाहरण के लिए,
स्ट्रिंग जिसमें केवल एक रिवर्स ठोस वर्ण होता है
अधिक जटिल रूप से "\\" के रूप में प्रदर्शित किया जा सकता है।

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

escape = %x5C    ; \ 

इस प्रकार JSON माणिक रत्न आंतरिक रूप से इस चरित्र से बचने और वहाँ JSON या JSON.pretty_generate parametrizing करके इस व्यवहार को बदलने के लिए कोई रास्ता नहीं है।

आप JSON मणि कार्यान्वयन विवरण में रुचि रखते हैं - यह '\' चार की स्पष्ट मानचित्रण के साथ आंतरिक मानचित्रण हैश परिभाषित करता है:

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

मैं JSON के शुद्ध माणिक संस्करण से इस कोड को ले लिया मणि gem install json_pure (ध्यान दें कि सी एक्सटेंशन संस्करण है जो gem install json द्वारा वितरित किया जाता है)।

निष्कर्ष: आप JSON genaration के बाद बैकस्लैश आप अपने आवेदन तर्क में इसे लागू करने की जरूरत है unescape करने के लिए, उपरोक्त कोड में की तरह की जरूरत है:

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।