2012-01-30 9 views
16

Actualmente estoy trabajando en una aplicación de Android, que obtiene sus datos de una API que proporciona datos JSON. Estoy almacenando elementos para los datos JSON como cadenas, lo que hace que aparezca un carácter extraño (por ejemplo, ''). Entiendo que esto tenga que ver con el juego de caracteres, por lo tanto, he establecido InputStreamReader en "UTF-8", pero no parece haber resuelto el problema.Android JSON CharSet UTF-8 problems

 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 "línea" da

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:\/ 

¿Alguna idea?

+0

¿Has probado también otras codificaciones como "ISO-8859-1"? Resolví un problema usando esto ... sin embargo, fue para letras acentuadas ... ¿Qué personajes te están dando estos problemas? – thermz

+0

¿Cuál es exactamente la salida de Log.d ("línea:", línea)? – Jens

+0

Lo siento, olvidé de poner la salida de registro (gracias Jens). – bencallis

Respuesta

39

intente lo siguiente fragmento de código que me ayudó cuando estaba teniendo un problema similar:

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

Muchas gracias. ¡Esto funciona! – bencallis

+1

¿por qué tenemos que usar una función tan retorcida? Tiene que estar encerrado en un bloque try catch. –

+1

Personalmente, me gusta adjuntar todos mis análisis JSON dentro de los bloques de captura de prueba por si acaso. – vm204

0

Sé que esto es un par de años después, pero yo he llegado con una solución más fiable que esta uno, y que no necesita toda la codificación de material extra

este fue encontrado por accidente mientras estaba buscando otra cosa, pero funciona:

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

lo que esto hace i s obtener el resultado como un objeto sin formato, y ponerlo al final de una cadena vacía lo fuerza a un formato de cadena; por supuesto, si la entrada no era originalmente una cadena, puede dar resultados oscuros, así que tal vez intente agarrarla como una primera cadena

tengo algo como esto:

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

esto pondrá a prueba existe la cadena, y luego reemplazarlo con la versión totalmente codificada

espero que esto ayude a alguien en el futuro :-)