我的Android应用程序的HTTP请求出现问题。
我正在尝试获取这个JSON字符串:
{
"produto": [
{
"pro_id": 2,
"pro_nome": "MELAO TIPO12"
},
{
"pro_id": 3,
"pro_nome": "MAMAO PAPAIA TIPO 15"
},
{
"pro_id": 4,
"pro_nome": "MELANCIA GRANDE"
},
{
"pro_id": 11,
"pro_nome": "MARACUJA SUPER"
},
{
"pro_id": 17,
"pro_nome": "MORANGO"
},
{
"pro_id": 18,
"pro_nome": "MANGA THOMY 12"
},
{
"pro_id": 19,
"pro_nome": "ABACAXI PEROLA TIPO 5"
},
{
"pro_id": 20,
"pro_nome": "ABACAXI PEROLA TIPO 15"
},
{
"pro_id": 21,
"pro_nome": "ABACAXI HAWAI 1IPO 4"
},
{
"pro_id": 22,
"pro_nome": "ABACAXI HAWAI TIPO 15"
},
{
"pro_id": 23,
"pro_nome": "ABACAXI HAWAI TIPO 5"
},
{
"pro_id": 29,
"pro_nome": "ABACAXI PEROLA TIPO 4"
},
{
"pro_id": 30,
"pro_nome": "ABACAXI PEROLA TIPO 5 PEQUENO"
},
{
"pro_id": 36,
"pro_nome": "ABACAXI HAWAI TIPO 10"
},
{
"pro_id": 41,
"pro_nome": "ABACATE"
},
{
"pro_id": 44,
"pro_nome": "AMEIXA IMPORT"
},
{
"pro_id": 45,
"pro_nome": "AMENDOIM TORRADO COM CASCA"
},
{
"pro_id": 51,
"pro_nome": "MARACUJA 3A"
},
{
"pro_id": 52,
"pro_nome": "MARACUJA 2A"
},
{
"pro_id": 53,
"pro_nome": "MANGA THOMY TIPO 15"
},
{
"pro_id": 56,
"pro_nome": "MAMAO PAPAIA TIPO 18"
},
{
"pro_id": 59,
"pro_nome": "MAMAO PAPAI 21"
},
{
"pro_id": 60,
"pro_nome": "COCO SECO 10"
},
{
"pro_id": 61,
"pro_nome": "COCO SECO 20"
},
{
"pro_id": 64,
"pro_nome": "MELAO TIPO 10"
},
{
"pro_id": 66,
"pro_nome": "MELAO TIPO7"
},
{
"pro_id": 68,
"pro_nome": "MACA FUJI 100 CAT1"
},
{
"pro_id": 70,
"pro_nome": "MACA FUJI 150"
},
{
"pro_id": 71,
"pro_nome": "MACA GALA CAT1 120"
},
{
"pro_id": 73,
"pro_nome": "MACA GALA 120 CAT2"
},
{
"pro_id": 76,
"pro_nome": "MELANCIA JAPONESA"
},
{
"pro_id": 77,
"pro_nome": "MELANCIA MEDIA"
},
{
"pro_id": 78,
"pro_nome": "MELANCIA PEQUENA"
},
{
"pro_id": 79,
"pro_nome": "MACA GALA150"
},
{
"pro_id": 80,
"pro_nome": "MACA GALA180"
},
{
"pro_id": 81,
"pro_nome": "MACA GALA216"
},
{
"pro_id": 82,
"pro_nome": "MACA GALA 135 CAT 1"
},
{
"pro_id": 84,
"pro_nome": "MACA FUJI120"
},
{
"pro_id": 85,
"pro_nome": "MACA FUJI GRANEL"
},
{
"pro_id": 86,
"pro_nome": "MACA GALA GRANEL"
},
{
"pro_id": 87,
"pro_nome": "MACA ARGENTINA100"
},
{
"pro_id": 88,
"pro_nome": "MACA VERDE "
},
{
"pro_id": 89,
"pro_nome": "PERA T90"
},
{
"pro_id": 90,
"pro_nome": "UVA RED GLOB"
},
{
"pro_id": 91,
"pro_nome": "UVA TOPSON"
},
{
"pro_id": 92,
"pro_nome": "PESSEGO IMPORT"
},
{
"pro_id": 94,
"pro_nome": "KIWI IMPORT"
},
{
"pro_id": 95,
"pro_nome": "NECTARINA "
},
{
"pro_id": 96,
"pro_nome": "PERA ESPANHOLA "
},
{
"pro_id": 97,
"pro_nome": "PERA PORTUGUESA"
}
]
}但是我得到了这个异常Unterminated object at character 1927 of "MY JSON STRING"
这是我的方法,它向URL发出HTTP请求:
public String ConsultaServidor(String URL_STRING) throws IOException {
InputStream is = null;
try {
URL url = new URL(URL_STRING);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(10000);
conn.setReadTimeout(15000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
conn.getResponseCode();
is = conn.getInputStream();
Reader reader = null;
reader = new InputStreamReader(is);
char[] buffer = new char[4096];
reader.read(buffer);
return new String(buffer);
} finally {
if (is != null) {
is.close();
}
}
}有人能帮我一下吗?
发布于 2015-07-18 04:07:53
在阅读时最好像BufferedReader那样使用一些缓冲区,而不是单独使用InputStreamReader,比如:
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s = null;
StringBuilder sb = new StringBuilder ();
while((s = br.readLine()) != null )
sb.append(s);
return sb.toString();发布于 2015-07-18 04:12:57
使用从输入流读取的单个缓冲区意味着,如果您拥有的字符数少于缓冲区中的字符数,则字符串的末尾将以许多零字符(ASCII '\u0000')结尾。
如果你有比缓冲区大小更多的字符,那么你的字符串将只包含前4096个字符,所以它被切成了中间。
读取输入流的通常方法是使用循环。您可以将整个输入流读取到内存中,也可以使用直接使用输入流的JSON解析器。
因为我不知道您使用的是什么JSON解析器,所以我将演示一种方法。
is = conn.getInputStream();
StringBuilder sb = new StringBuilder();
try ( Reader reader = new InputStreamReader(is) ) {
char[] buffer = new char[4096];
int numRead;
while ( (numRead = reader.read(buffer)) != -1 ) {
sb.append(buffer, 0, numRead );
}
} catch ( IOException e ) {
e.printStackTrace(); // Or other exception handling
}
return sb.toString();请注意,在此方法中,您将一直读到流的末尾,也就是从read返回的值为-1时。并且每次只追加实际读取的字符数(不一定是4096!)字符串生成器。
还要注意的是,你有一个try-with-resources,确保在你完成的时候关闭阅读器。
另一种方法是使用BufferedReader并逐行读取,直到文件结束。
发布于 2015-07-18 04:22:46
解决方案是更改代码。就像安基特说的那样,使用BufferedReader..
最后的代码是:
public String ConsultaServidor(String URL_STRING) throws IOException {
//InputStream is = null;
try {
URL url = new URL(URL_STRING);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(10000);
conn.setReadTimeout(15000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
conn.getResponseCode();
// is = conn.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
// Reader reader = null;
// reader = new InputStreamReader(is);
String inputLine;
String responseData;
responseData = "";
while ((inputLine = in.readLine()) != null) // read till you can receive any data
responseData += inputLine;
in.close();
return new String(responseData);
} finally {
//if (in != null) {
// in.close();
// }
}
}https://stackoverflow.com/questions/31483668
复制相似问题