【发布时间】:2012-06-16 18:35:17
【问题描述】:
我在处理 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());
第二个逃过我(没有双关语)
我认为这不起作用的原因是反冲用于转义字符。我尝试了许多不同的方法来读取数据,但我没有运气。有没有办法在不使用正则表达式的情况下导入数据来处理这个问题?
解决方案
我们今天的克星:“\x26”——ASCII(十六进制)
将原始数据读入一个字符数组。来自 apache 的 commons.io 库是一个很好的方法。完成此操作后,在 for 循环中读取 char 数组以查找“\”,如果命中则在下一个数组位置查找“x”。如果再次命中,则取 char 数组中的下两个字符。这两个字符是您的 ASCII 十六进制值。将十六进制转换为十进制形式,然后将十进制转换为字符。获取此字符并将其附加到字符串生成器。
如果没有匹配(带有“\”),则将字符附加到字符串生成器。我们现在可以调用.toString() 方法并将其转换为字符串。
从那里,数据可能包含一些 HTML 残余(在这种情况下是'和/或 )。使用 Html.fromHtml() 处理了这个。
【问题讨论】:
-
见this。而且,您是否尝试过逃避转义字符? (如第二个答案所建议)
-
@Keyser 我之前确实注意到了该链接,但它没有提供可行的解决方案。我可以逃脱逃脱,但这不需要使用正则表达式将“\”替换为“\\”吗?
-
答案如下,以及答案的cmets中解决此问题的方法的描述
-
让我想起了很多链接:p 太糟糕了,没有更好的解决方案。