Android中的Flickr JSON解析
我想从这个url()解析JSON,但文档实际上返回了一个无效的JSON。看Android中的Flickr JSON解析,android,json,parsing,flickr,Android,Json,Parsing,Flickr,我想从这个url()解析JSON,但文档实际上返回了一个无效的JSON。看 jsonFlickrFeed({ "title": "Uploads from everyone", "link": "http://www.flickr.com/photos/", "description": "", "modified": "2012-11-26T18:27:41Z", "generator": "http
jsonFlickrFeed({
"title": "Uploads from everyone",
"link": "http://www.flickr.com/photos/",
"description": "",
"modified": "2012-11-26T18:27:41Z",
"generator": "http://www.flickr.com/",
"items": [
{
"title": "2012 Thanksgiving Holiday Weekend",
"link": "http://www.flickr.com/photos/agape_boarding_school/8220697785/",
"media": {"m":"http://farm9.staticflickr.com/8478/8220697785_bb298ac5b3_m.jpg"},
"date_taken": "2012-11-24T14:19:21-08:00",
"description": " <p><a href=\"http://www.flickr.com/people/agape_boarding_school/\">Agape Boarding School<\/a> posted a photo:<\/p> <p><a href=\"http://www.flickr.com/photos/agape_boarding_school/8220697785/\" title=\"2012 Thanksgiving Holiday Weekend\"><img src=\"http://farm9.staticflickr.com/8478/8220697785_bb298ac5b3_m.jpg\" width=\"240\" height=\"159\" alt=\"2012 Thanksgiving Holiday Weekend\" /><\/a><\/p> <p>Great Day at Agape Boarding School<\/p>",
"published": "2012-11-26T18:27:41Z",
"author": "nobody@flickr.com (Agape Boarding School)",
"author_id": "36563683@N07",
"tags": "school boarding agape"
}, ...
jsonFlickrFeed({
“标题”:“从每个人上传”,
“链接”:http://www.flickr.com/photos/",
“说明”:“,
“修改”:“2012-11-26T18:27:41Z”,
“生成器”:http://www.flickr.com/",
“项目”:[
{
“标题”:“2012感恩节周末”,
“链接”:http://www.flickr.com/photos/agape_boarding_school/8220697785/",
“媒体”:{“m”:”http://farm9.staticflickr.com/8478/8220697785_bb298ac5b3_m.jpg"},
“拍摄日期”:“2012-11-24T14:19:21-08:00”,
“描述”:“Agape寄宿学校张贴了一张照片:Agape寄宿学校的伟大一天”,
“已出版”:“2012-11-26T18:27:41Z”,
“作者”:nobody@flickr.com(阿加佩寄宿学校)“,
“作者id”:36563683@N07",
“标签”:“学校寄宿”
}, ...
我想让我的解析器尽可能通用,那么删除文档中的“jsonFlickrFeed”(“jsonFlickrFeed”)部分并只使用JSON-it本身的更好方法是什么
public class JSONParser extends AsyncTask <String, Void, JSONObject> {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
@Override
protected JSONObject doInBackground(String... params) {
String url=params[0];
// Making HTTP request
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
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();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
公共类JSONParser扩展了异步任务{
静态InputStream为空;
静态JSONObject jObj=null;
静态字符串json=“”;
//建造师
公共JSONParser(){
}
@凌驾
受保护的JSONObject doInBackground(字符串…参数){
字符串url=params[0];
//发出HTTP请求
试一试{
//defaultHttpClient
DefaultHttpClient httpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(url);
HttpResponse HttpResponse=httpClient.execute(httpPost);
HttpEntity HttpEntity=httpResponse.getEntity();
is=httpEntity.getContent();
}捕获(不支持的编码异常e){
e、 printStackTrace();
}捕获(客户端协议例外e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
试一试{
BufferedReader reader=新的BufferedReader(新的InputStreamReader(
is,“iso-8859-1”),8);
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
is.close();
json=sb.toString();
}捕获(例外e){
Log.e(“缓冲区错误”,“错误转换结果”+e.toString());
}
//尝试将字符串解析为JSON对象
试一试{
jObj=新的JSONObject(json);
}捕获(JSONException e){
Log.e(“JSON解析器”,“错误解析数据”+e.toString());
}
//返回JSON字符串
返回jObj;
}
}正如您所说,您只需删除字符串的这一部分,然后再对其进行解析
如果你想变得更一般,你可以搜索第一个
{
字符并删除它前面的所有内容,最后一个}
字符并删除它后面的所有内容。但这仍然不能确保输入是有效的。我已经通过给定的方式解决了这个问题
Flickr旧web API是:
Flickr最新的web API是:
使用最新的一个web API
替换您的用户id而不是xxxxxxxx
希望对您有所帮助。看起来您需要的是原始json。您需要添加一个“nojsoncallback=1”来删除函数包装器
[请参阅FLICKR JSON响应格式](“如果您只需要原始JSON,而不需要函数包装器”)这看起来像是一个JSONP调用的结果,带有&callback=jsonFlickrFeed…??@ScottEvernden,我想你是对的。我对这个主题不太了解。我只是在谷歌上搜索了一下,看起来像是一个JSONP。问题是我只需要JSON,而不需要让我的类依赖于应用程序。没错,我需要“修剪”文档。我想知道是否有方法不修改我的解析器类就可以做到这一点。因为如果我这样做,每次发生类似的事情时,我都需要重写我的JSON解析器。这不是一个好的编程实践。作为Python程序员,我认为正则表达式可以像
“*(\{.\\\\})一样轻松地解决修剪部分。”
。您可以使用regex,但当服务器响应较大时,它可能会使应用程序反应缓慢。我认为最好的解决方案是从AsyncTask返回字符串,并在使用它的每个类/项目中对其进行不同的解析。