Android中的Flickr 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

我想从这个url()解析JSON,但文档实际上返回了一个无效的JSON。看

       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返回字符串,并在使用它的每个类/项目中对其进行不同的解析。