2012-01-30 100 views
16

我目前正在开发一个Android应用程序,它从提供JSON数据的API获取其数据。 我正在将JSON数据的项存储为字符串,这会导致出现一些奇怪的字符(例如'')。我明白这与字符集有关,因此我将InputStreamReader设置为“UTF-8”,但似乎没有解决问题。Android JSON CharSet UTF-8问题

 URL hukd = new URL(requestUrl); 
     URLConnection tc = hukd.openConnection(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(tc.getInputStream(), "UTF-8")); 
     String line = in.readLine(); 
     Log.d("line :", line); 
     JSONObject obj = new JSONObject(line); 
     JSONArray ja = obj.getJSONObject("deals").getJSONArray("items"); 
     for (int i = 0; i < ja.length(); i++) { // each deal 
      JSONObject jo = (JSONObject) ja.get(i); 
      // make the deal 
      Deal d = new Deal(jo.getString("title"), 
        jo.getString("description"), 
        jo.getString("price"),jo.getString("temperature"), 
        jo.getJSONObject("merchant").getString("name"), 
        jo.getString("deal_image"), 
        jo.getString("deal_image_highres")); 
      listItems.add(d); 
      Log.d("Deal:", d.toString()); 
     } 

Log.d “行” 给出

01-30 19:56:01.909: D/line :(610): {"deals":{"items":[{"title":"Absolute steal ** Harmony one remote in store only Comet \u00c2\u00a349.98 **","deal_link":"http:\/\/www.hotukdeals.com\/deals\/absolute-steal-harmony-one-remote-store-only-comet-49-98-1131779?aui=465","mobile_deal_link":"http:\/\/m.hotukdeals.com\/deals\/absolute-steal-harmony-one-remote-store-only-comet-49-98-1131779?aui=465","deal_image":"http:\/\/www.hotukdeals.com\/images\/threads\/1131779_1.jpg","description":"Was just in comet getting two new washing machines when I stumbled upon a load of Harmony ones on the end of an isle \u00e2\u0080\u00a6. I nearly blew a fuse when I saw they had been reduced from \u00c2\u00a380.00 to under \u00c2\u00a350 as I just bought 3 of these before xmas at \u00c2\u00a368.00 ea which I thought was a true bargain.\r\n\r\nI asked they guy and he said they were stopping doing them as far as he knew and that the deal should be nation wide this must be the cheapest I've seen for the UK version ever even though this is the Harmony one and not the one + is it still a great remote which does just about everything you could want it to. \r\n\r\n** note I don\u00e2\u0080\u0099t have a picture of the price tag but I have these at my home and are 100% that it\u00e2\u0080\u0099s the harmony one on sale hope this helps some of you guys and girls out **\r\n\r\nThe Logitech Harmony One remote control lets you replace 15 remotes with one, easy to use device. With its clear, touch screen display this Harmony learning remote control makes controlling the most complex of systems easy. A graphic interface allows you, for example, to watch a DVD at the touch of a button.\r\n","submit_time":"48 minutes ago","hot_time":"1 minute ago","poster_name":"no1son","temperature":106.88999939,"price":49.98,"timestamp":1327950390,"expired":"false","forum":{"name":"Deals","url_name":"deals"},"category":{"name":"Audiovisual","url_name":"audiovisual"},"merchant":{"name":"Comet","url_name":"comet.co.uk"},"tags":{"items":[{"name":"leeds"}]},"deal_image_highres":"http:\/\/www.hotukdeals.com\/images\/threads\/high-res\/1131779_1.jpg"},{"title":"Youth Brazil Shirt \u00c2\u00a34 at Very\/Littlewoods","deal_link":"http:\/\/www.hotukdeals.com\/deals\/youth-brazil-shirt-4-very-littlewoods-1131765?aui=465","mobile_deal_link":"http:\/\/m.hotukdeals.com\/deals\/youth-brazil-shirt-4-very-littlewoods-1131765?aui=465","deal_image":"http:\/\/www.hotukdeals.com\/images\/threads\/1131765_1.jpg","description":"2010 Brazil shirt by Nike\r\nAvailable in all youth sizes.\r\nFree delivery through collect plus","submit_time":"1 hour, 4 minutes ago","hot_time":"14 minutes ago","poster_name":"ericagradus","temperature":161.479995728,"price":4,"timestamp":1327949447,"expired":"false","forum":{"name":"Deals","url_name":"deals"},"category":{"name":"Fashion","url_name":"fashion"},"merchant":{"name":"Very","url_name":"very.co.uk"},"tags":{"items":[{"name":"brazil shirt"},{"name":"very"},{"name":"littlewoods"}]},"deal_image_highres":"http:\/\/www.hotukdeals.com\/images\/threads\/high-res\/1131765_1.jpg"},{"title":"Milk Chocolate Mikado 29p at Home Bargains","deal_link":"http:\/\/www.hotukdeals.com\/deals\/milk-chocolate-mikado-29p-home-bargains-1130742?aui=465","mobile_deal_link":"http:\/\/m.hotukdeals.com\/deals\/milk-chocolate-mikado-29p-home-bargains-1130742?aui=465","deal_image":"http:\/\/www.hotukdeals.com\/images\/threads\/1130742_1.jpg","description":"Was in Home Bargains in Lancaster and they had the MIlk Chocolate Mikado for 29p. The white and hazelnut were 59p. Didn't check the sell by day as it took all my will power to resist haha!\r\n\r\nSorry if this is a duplicate I did look for it but couldn't find it.","submit_time":"1 day, 3 hours ago","hot_time":"14 minutes ago","poster_name":"cazi77","temperature":146.61000061,"price":0.29,"timestamp":1327853963,"expired":"false","forum":{"name":"Deals","url_name":"deals"},"category":{"name":"Groceries","url_name":"groceries"},"merchant":{"name":"Home Bargains","url_name":"homebargains.co.uk"},"tags":{"items":[]},"deal_image_highres":"http:\/ 

任何想法?

+0

你是否也试过其他编码,如“ISO-8859-1”?我用这个解决了一些问题......但它是用于重音字母......哪些字符给你这个问题? – thermz 2012-01-30 19:52:43

+0

然后Log.d(“line:”,line)的输出到底是什么? – Jens 2012-01-30 19:53:46

+0

抱歉忘了把日志输出(谢谢Jens)。 – bencallis 2012-01-30 19:58:20

回答

39

试试下面的代码片段时,我有一个类似的问题这让我:

new String(jo.getString("name").getBytes("ISO-8859-1"), "UTF-8"); 
+0

非常感谢。这工作! – bencallis 2012-01-30 22:15:57

+1

为什么我们必须使用这种扭曲的功能?它必须包含在try catch块中。 – 2013-07-31 13:43:02

+1

我个人喜欢把我所有的json解析放在try catch块中以防万一。 – vm204 2013-07-31 15:52:19

0

我知道这是一个几年后,但我已经想出比这更可靠的解决方案之一,它并不需要所有的编码额外的东西

这是偶然发现的,而我一直在寻找别的东西,但它的工作原理:

"" + jo.opt("name"); 

这样做我什么将结果作为原始对象获得,并将其放在空字符串的末尾将其强制为字符串格式 - 当然,如果条目最初不是字符串,它可能会给出难以理解的结果,因此可能尝试将其作为串第一

我有这样的事情:

String s = ""; 
try { 
    s = jo.getString("name"); 
    s = "" + jo.opt("name"); 
} catch (Exception e) { 
    Log.e("JSON error", "error:" + e.toString()); 
} 

这将测试该字符串存在,然后用完全编码版本

我希望这可以帮助别人,将来:-)更换