2012-06-18 6 views
5

पर मैं http://hndroidapi.appspot.com/news/format/json/page/?appid=test पर रिमोट जेसन से डेटा खींच रहा हूं। जिस समस्या में मैं चल रहा हूं वह यह है कि यह एपीआई यूटीएफ -8 एन्कोडिंग को सही तरीके से संभालने के बिना जेएसओएन का निर्माण कर रहा है (अगर मैं यहां गलत हूं तो मुझे सही करें)। उदाहरण के लिए, परिणाम अभी पारित हो कि का हिस्साजेसन से खराब यूटीएफ -8 को संभालना, रूबी

{ 
"title":"IPad - please don€™t ding while you and I are asleep ", 
"url":"http://modern-products.tumblr.com/post/25384729998/ipad-please-dont-ding-while-you-and-i-are-asleep", 
"score":"10 points", 
"user":"roee", 
"comments":"18 comments", 
"time":"1 hour ago", 
"item_id":"4128497", 
"description":"10 points by roee 1 hour ago | 18 comments" 
} 

सूचना don€™t है। और यह एकमात्र प्रकार का चरित्र नहीं है जिस पर यह चकित हो रहा है। क्या डेटा कुछ भी साफ करने के लिए मैं कुछ भी कर सकता हूं, यह देखते हुए कि मैं एपीआई को नियंत्रित नहीं करता हूं?

संपादित करें:

यहाँ कैसे मैं JSON नीचे खींच कर रहा हूँ है:

hn_url = "http://hndroidapi.appspot.com/news/format/json/page/?appid=test" 
    url = URI.parse(hn_url) 

    # Attempt to get the json 
    req = Net::HTTP::Get.new(hn_url) 
    req.add_field('User-Agent', 'Test') 
    res = Net::HTTP.start(url.host, url.port) {|http| http.request(req) } 
    response = res.body 
    if response.nil? 
    puts "Bad response when fetching HN json" 
    return 
    end 

    # Attempt to parse the json 
    result = JSON.parse(response) 
    if result.nil? 
    puts "Error parsing HN json" 
    return 
    end 

संपादित करें 2:

बस एपीआई GitHub पृष्ठ मिला। ऐसा लगता है कि यह एक उत्कृष्ट मुद्दा है। अभी तक सुनिश्चित नहीं करता है, तो किसी भी समाधान है कि मैं अपने अंत से कुछ नहीं कर सकता है: https://github.com/glebpopov/Hacker-News-Droid-API/issues/4

+0

ऐसा लगता है कि आपके द्वारा प्राप्त किए जा रहे JSON प्रतिक्रिया निकाय में HTML-सुरक्षित प्रतीकों शामिल हो सकते हैं। मुझे एक नज़र में कोई भी बुरा वर्ण नहीं दिख रहा है, और मुझे लगता है कि प्रतिक्रिया 'सामग्री-प्रकार' शीर्षलेख 'एप्लिकेशन/जेसन' पर सेट है; charset = utf-8', जो सही दिखता है। आप प्रतिक्रिया शरीर कैसे प्राप्त कर रहे हैं? मैं 'देव HTTP क्लाइंट' या कर्ल जैसे ब्राउज़र टूल के साथ प्रतिक्रिया की जांच करने की कोशिश करता हूं, और देख सकता हूं कि आपका आवेदन वास्तविक प्रतिक्रिया से अलग हो रहा है या नहीं। यदि ऐसा है, तो आप इसे अपने कोड में गलत तरीके से संभालेंगे। –

+0

धन्यवाद। मैंने संपादन में अपना कोड जोड़ा। मुद्दा यह है कि वे HTML- सुरक्षित प्रतीक हैं। लेकिन, यह यूरो प्रतीक और एक 'टीएम' प्रतीक नहीं होना चाहिए। यह एक apostrophe होना चाहिए। – hodgesmr

+0

आप 'puts res.body' का उपयोग कर कंसोल में सटीक प्रतिक्रिया देख सकते हैं। क्या आप बाद में 'परिणाम' ऑब्जेक्ट के माध्यम से फंकी प्रतीकों को देख रहे हैं? –

उत्तर

4

यह JSON उत्तर शरीर आप प्राप्त कर रहे UTF-8 के बजाय US-ASCII में प्राप्त की जा रही है क्योंकि Net::HTTP जानबूझकर नहीं है की तरह लग रहा बल एन्कोडिंग।

1.9.3p194 :044 > puts res.body.encoding 
US-ASCII 

रूबी 1.9.3 में, आप अगर आप जानते हैं कि यह माना जाता है एन्कोडिंग मजबूर कर सकते हैं। इसे आज़माएं:

response = res.body.force_encoding('UTF-8') 

जेएसओएन पार्सर को यूटीएफ -8 को जिस तरह से आप चाहते हैं उसे संभालना चाहिए।

संदर्भ

1

force_encoding का उपयोग करना सबसे अच्छा समाधान की तरह लगता है। केविन डिकर्सन के जवाब के बाद, यहां अजीबता का एक स्पष्टीकरण है।

Net::HTTP एक गड़बड़ है।

1.9.3 पर: सर्वर एक chunked प्रतिक्रिया भेजता है

  • , तो आप हमेशा ASCII-8bit मिल चाहते हैं। ऐसा लगता है कि अन्य परिदृश्यों पर प्राथमिकता है।
  • यदि आप http.request पर Get ऑब्जेक्ट के साथ कॉल करते हैं, तो आपको यूएस-एएससीआईआईआई मिल जाएगी। यह विधि आपके लिए संपीड़न नहीं करती है।
  • यदि आप http.get पर कॉल करते हैं, तो संपीड़न सक्षम है।
    • सर्वर संपीड़न का समर्थन करता है, तो आप ASCII-8bit
    • मिल चाहते हैं, तो सर्वर एक संकुचित शरीर नहीं भेजा जाता है, तो आप प्राप्त होता US-ASCII

आप चाहते यूएस-एएससीआईआई प्राप्त करें क्योंकि Net::HTTP प्रतिक्रिया प्राप्त करने के लिए बफर स्ट्रिंग बनाता है, यह दुभाषिया के डिफ़ॉल्ट स्रोत फ़ाइल एन्कोडिंग में बनाया गया है, जो यूएस-एएससीआईआईआई है। क्योंकि यह है कि get विधि में जब decompressing करने के लिए hardcoded है (net/ स्रोत फ़ाइलें, शीर्ष पर एन्कोडिंग टिप्पणी नहीं है, तो वे गहरे लाल रंग का डिफ़ॉल्ट उपयोग करें।)

विसंपीड़न पैदा करता ASCII-8bit।

2.0 पर, ऐसा लगता है कि आप हमेशा यूटीएफ -8 वापस प्राप्त करते हैं, लेकिन ऐसा इसलिए है क्योंकि यह डिफ़ॉल्ट स्रोत-फ़ाइल एन्कोडिंग है। यदि आप इसे -K विकल्प के माध्यम से बदलते हैं, तो प्रतिक्रिया एन्कोडिंग तदनुसार बदल जाएगी। n, e, s, u से -K पास करने का प्रयास करें।

संबंधित मुद्दे