Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检测和解析转义字符“\&引用;从JSON文件?_Java_Android_Json - Fatal编程技术网

Java 检测和解析转义字符“\&引用;从JSON文件?

Java 检测和解析转义字符“\&引用;从JSON文件?,java,android,json,Java,Android,Json,我对JSON文件中的数据有问题。我正在使用下面的链接,来自谷歌 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

我对JSON文件中的数据有问题。我正在使用下面的链接,来自谷歌

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文件中提取数据,我收到的输出如下(注意缺少反斜杠):

我目前处理第一个问题的方法如下:

JSONRowData.setJTitle((Html.fromHtml((article.getString(TAG_TITLE).replaceAll("x26", "&")))).toString());
但第二个我不明白(没有双关语)

我想这不起作用的原因是因为反冲被用于转义字符。我尝试了许多不同的方法来读取数据,但我没有运气。有没有一种方法可以在不使用正则表达式的情况下导入数据来处理此问题


解决方案

我们今天的敌人:“\x26”-ASCII(十六进制表示法)

将原始数据读入字符数组。apache中的commons.io库是一种很好的方法。完成此操作后,在for循环中读取字符数组,查找“\”,如果找到了,则在下一个数组位置查找“x”。如果再次命中,则获取字符数组中的下两个字符。这两个字符是ASCII十六进制值。将十六进制转换为十进制形式,然后将十进制转换为字符。获取此字符并将其附加到字符串生成器

如果没有匹配项(带“\”),则将该字符附加到字符串生成器。我们现在可以调用
.toString()
方法并将其转换为字符串


从这里开始,数据可能包含一些HTML残余('和/或在本例中)。使用Html.fromHtml()解决了这个问题

这里的问题是谷歌——或者至少是那个url——是1,2。JSON库虽然没有完全拒绝无效的JSON,但正在以“好吧,让我们忽略这个\胡说八道,继续”的方式解析它。也就是说,错误的不是渲染,而是输入

1不允许
\x
以字符串形式出现(除非
\
本身已转义),因为
\
(未转义时)后面只能跟一小部分字符(不包括
x
)。字符代码的转义必须由
\u1234
而不是
\x12
完成

我能想到的唯一“修复”是真正的粗俗的黑客:即读取原始文本并将
\x12
转换为
\u0012
。(事实上,这并不是一个很糟糕的黑客行为,因为不需要考虑上下文敏感的内容;但是,不应该要求这样做!谷歌真可耻。)

2提取的JSON字符串文本无效:

“苹果公司(NASDAQ:AAPL)股价今年继续领涨大盘股科技股。在周一开始的一个关键事件后,该股价格没有出现重大变动。”

(要使其有效,请将
\x26
替换为
\u0026
&

祝您编码愉快,祝您好运:)


在Java中,一种[未经测试的]方法可能是使用正则表达式(通过
String.replaceAll
):


看见还有,你试过逃逸吗?(正如第二个答案中所建议的)@Keyser我以前确实注意到了这个链接,但它并没有提供一个可行的解决方案。我可以逃避逃避,但这不需要使用正则表达式将“\”替换为“\ \”?答案如下,以及回答者评论中解决此问题的方法说明提醒了我很多链接:p太糟糕了,没有更好的解决方案。我担心这一点,我的一厢情愿总是占上风。我会尝试利用原始数据,也许我可以从那里解决问题。我可以以XML的形式获取输入,但是数据被包装在各种HTML标记中并嵌套在这些标记中,这太糟糕了。谢谢你的回复,我也会尝试从谷歌开发者那里得到答案。@wdziemia实际上,JSON已经坏了很多。我跳过了问题中的断键,但键也不是JSON字符串,因此无效。。。看起来有人生成了“JavaScript对象文本”,而不是JSON。我会尽量不再去想它,因为它让我头疼:一家成熟的it公司提供的服务(据说全是非常聪明的人)引入了ProtocolBuffers…让它工作起来了,谢谢你的帮助!将原始数据读入一个字符数组,然后将十六进制表示法中的ASCII字符替换为相应的十进制值。然后将十进制值强制转换为一个字符。fromHtml()从剩余的Html实体代码/Html标记中取出一块蛋糕。再次感谢@wdziemia我很高兴你找到了答案。不过,我可能会尝试使用字符串而不是字符数组。我已经用一个小的[未经测试的]例子更新了我的帖子,这个例子可能也很有用……这真是太好笑了。我刚刚访问了链接,但密钥仍然没有引用,可能还有很多其他问题。你们没有人报告这件事吗?很容易获得正确的JSON。我会报告的。。。明天大概
JSONRowData.setJTitle((Html.fromHtml((article.getString(TAG_TITLE).replaceAll("x26", "&")))).toString());
inputString.replaceAll("\\x(\d{2})", "\\u00$1")