将字节数组转换为字符串时截断JSON

时间:2012-02-15 23:34:51

标签: java android json

我有一个Android应用程序,它连接到PC上的.NET HTTP服务,并允许浏览该PC上的媒体目录。该接口类似于带有当前目录/媒体文件列表的文件浏览器。

当用户从列表中选择目录名称时,该目录的内容将在JSON响应中返回。

我的问题是有时Android的结尾认为JSON不完整但我不知道为什么我在服务器端记录了JSON字符串并且它被正确终止。处理响应的Android代码如下......

int contentLength = -1;
int totalRead = 0;
int numRead = -1;

InputStream inStream = connHelper.getInputStream();
contentLength = connHelper.getContentLength();

byte[] buffer = new byte[contentLength != -1 ? contentLength : 8192];
while ((numRead = inStream.read(buffer)) != -1)
    if (numRead != 0)
        totalRead += numRead;

Log.d(TAG, "getMediaList() - totalRead: " + totalRead);
String jsonString = new String(buffer, "UTF-8");
Log.d(TAG, "jsonString.length() - " + jsonString.length());
Log.d(TAG, "jsonString - " + jsonString);

这是来自Android logcat的一系列事件的日志......

requestValue: D:\Jukebox\Classical\Classic FM - Smooth Classics (Do Not Disturb) (Disc 2)\
getMediaList() - totalRead: 501
jsonString.length() - 501
jsonString - {"folders":[],"media":[<cut for brevity>]}

...但是这里有一个糟糕的日志,这对于这个媒体列表是一致的......

requestValue: D:\Jukebox\Classical\De Lucia, Paco\Collection\
getMediaList() - totalRead: 353
jsonString.length() - 351
jsonString - {"folders":[],"media":[<cut for brevity>,"14 Concierto de Aranjuez (Adagio).mp3"

请注意,问题媒体列表的总字节数为353,但jsonString仅为351字节。另请注意,jsonString的日志显示缺少关闭的数组/对象字符]}

我对此完全感到困惑。 .NET服务器日志显示完整的JSON字符串,Android日志显示353字节被读取但jsonString长度仅显示351字节。任何人都可以解释可能导致这种情况的原因吗?

2 个答案:

答案 0 :(得分:2)

我怀疑您的问题是来自您的信息流的多字节字符。特别是因为你的样本中有一些非英文文件名,很可能它会被一些有趣的角色所困扰。而不是从InputStream转换为字节到String,看看您是否可以使用InputStreamReader来处理所有棘手的事情。

答案 1 :(得分:1)

首先,您的循环不正确,因为read无法保证读取您请求的长度。如果没有,您只需覆盖数组的开头。

这似乎不是问题,但我仍然会使用correct loop

您是否明确检查了服务器上的长度是什么?