3

JSON ファイルのデータに問題があります。Google の次のリンクを使用しています。

http://www.google.com/finance/company_news?q=AAPL&output=json"

私の問題は、データを解析して画面に表示したいときに発生します。何らかの理由でデータが正しくデコードされていません。

生データ:

 1.) one which must have set many of the company\x26#39;s board on the edge of their
 2.) Making Less Money From Next \x3cb\x3e...\x3c/b\x3e

データを取り込むときは、次のことを行います。

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();        
BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8); 
StringBuilder sb = new StringBuilder();
String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "n");
}
is.close();
json = sb.toString();

org.json を使用して json ファイルからデータを抽出すると、次のような出力が得られます (バックスラッシュがないことに注意してください)。

1.)one which must have set many of the companyx26#39;s board on the edge of their
2.)Making Less Money From Next x3cbx3e...x3c/bx3e

これによって最初の問題を処理するための私の現在の方法:

JSONRowData.setJTitle((Html.fromHtml((article.getString(TAG_TITLE).replaceAll("x26", "&")))).toString());

2番目のものは私を逃れます(しゃれは意図されていません)

これが機能しない理由は、バックラッシュがエスケープ文字に使用されているためだと思います。データを読み込むさまざまな方法を試しましたが、うまくいきませんでした。正規表現を使用せずにこの問題を処理するためにデータをインポートする方法はありますか?


解決

今日の宿敵: "\x26" -- ASCII (16 進表記)

Raw データを Char 配列に読み取ります。apache の commons.io ライブラリは、これを行うのに最適な方法です。これを行ったら、for ループで char 配列を読み取り、"\" を探します。ヒットした場合は、次の配列位置で "x" を探します。再びヒットした場合は、char 配列の次の 2 文字を取得します。これらの 2 つの文字は、ASCII 16 進値です。16 進数を 10 進数形式に変換してから、10 進数を char にキャストします。この文字を取得して、文字列ビルダーに追加します。

("\" で) 一致するものがない場合は、その文字を文字列ビルダーに追加します。.toString()メソッドを呼び出して文字列に変換できるようになりました。

そこから、データにはいくつかの HTML の残骸 (' および/またはこの場合)。Html.fromHtml() の使用 これを処理しました。

4

1 に答える 1

3

ここでの問題は、Google (または少なくともその URL) が無効なJSON 1,2を提供していることです。JSON ライブラリは、無効な JSON を完全に拒否するわけではありませんが、「まあ、この \ ナンセンスを無視して続行しましょう」という方法で解析しています。つまり、間違っているのはレンダリングではなく、間違っているのは入力です。

1 (エスケープされていない場合) の後には小さな文字セット ( は含まれません) しか続かないため、文字列に を表示することはできません(自体がエスケープされている場合を除く)。文字コードのエスケープは、 ではなくで行う必要があります。\x\\x\u1234\x12

私が考えることができる唯一の「修正」は、本当に大雑把なハックです。つまり、生のテキストを読んでに変換\x12\u0012ます。(実際には、コンテキストに依存したものを考慮する必要がないため、それほど悪いハックではありませんが、必要とすべきではありません! Google に恥をかかせてください。)

2抽出された無効なJSON 文字列リテラル:

「Apple Inc. (NASDAQ:AAPL) の株価は、今年も引き続き大型ハイテク株をリードしました。月曜日に始まった重要なイベントの後、株価は大きな動きを見せませんでした。」

(これを有効にするには\x26\u0026またはに置き換え&ます。)

幸せなコーディングと -- 幸運を祈ります :)


Java では、1 つの [テストされていない] アプローチは、(経由でString.replaceAll) 正規表現を使用することです。

inputString.replaceAll("\\x(\d{2})", "\\u00$1") 
于 2012-06-14T00:22:24.490 に答える