2012-02-15 9 views
1

私は、PC上の.NET HTTPサービスに接続し、そのPC上のメディアディレクトリを閲覧できるAndroidアプリを持っています。インタフェースは、現在のディレクトリ/メディアファイルのリストを持つファイルエクスプローラに似ています。バイト配列を文字列に変換するときに切り捨てられたJSON

ユーザーがリストからディレクトリ名を選択すると、そのディレクトリの内容がJSON応答で返されます。

私の問題は、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); 

はここで...イベントの良い一連のアンドロイド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

ストリームからマルチバイト文字が届いていると思われます。特に、あなたのサンプルに英語以外のファイル名がいくつかあるので、それは面白いキャラクターの上で窒息している可能性が高いです。 InputStreamからStringにバイトを変換するのではなく、InputStreamReaderを使用してそのすべての面倒なことを処理できるかどうかを確認してください。

+0

私はそれも疑っていますが、欠落している文字は明らかに ']}'です。また、実際にUTF-8であれば、彼が使用しているコンストラクタはうまくいきます。 –

+1

@Argyle:私はあなたが何かにいるかもしれないと思います。はい、両端にUTF-8処理がありますが、コンテンツ長を設定するときにサーバー上で何か問題があると思います。マルチバイト文字には、分音記号を持つ1つの「曲」があり、2つの余分なバイトを考慮する可能性があるため、説明します。私はすぐに書き直す必要があります。 – Squonk

+1

@Argyle:正しい方向で私を指摘していただきありがとうございます - 私はサーバーエンドコードを見直す機会がありました。正しいマルチバイトではなくメディアファイル名の文字数としてContent-Lengthを報告していましたカウント - すべての分音文字のサポートですべてが機能しています。私は明日の 'InputStreamReader'を見ていきます(現在は2時近くです)。スペインのギター音楽を鑑賞することで頭が痛いと思ったのは誰でしょう? :D – Squonk

1

最初にループが正しくありません。readは、要求された長さを読み取ることが保証されていません。そうでなければ、配列の先頭を上書きします。

これは問題ではないようですが、私はまだcorrect loopを使用します。

サーバの長さが何であるかを明示的に確認しましたか?

+0

あなたは正しいです、それは良いループではありません - 私は通常あなたのリンクのものに似ていますが、私は物事をやろうとしていたので、それを元に戻しました。しかし、これは問題ではないことも間違いないとしています。最初の(良い)例は一貫して501バイトを読み取り、文字列の長さは一貫して501です。 2番目の文字は一貫して353が読み込まれますが、文字列の長さは351です。サーバーに記録された文字列には、 '}}'という文字列が含まれており、正確には353バイトです。 – Squonk

+0

もう一度ありがとうございます - 私はもちろん、問題が解決されたより賢明なループに戻ってきました。 – Squonk

関連する問題