如何从Android中的JSON url解析图像?

时间:2012-12-14 02:56:30

标签: android json android-imageview android-image

Image

我正在从Wordpress博客解析这些内容。我不知道如何从JSON获取图片。这是图片网址"content":"<p><img class=\"aligncenter\" style=\"cursor: -moz-zoom-in;\" src=\"http:\/\/sphotos-h.ak.fbcdn.net\/hphotos-ak-ash4\/395050_10151219612828815_5123523_n.jpg\" alt=\"http:\/\/sphotos-h.ak.fbcdn.net\/hphotos-ak-ash4\/395050_10151219612828815_5123523_n.jpg\" width=\"390\" height=\"466\" \/><\/p>\n<p><span id=\"more-5267\"><\/span><\/p>\n<p>Some texts here...XXXXXYYYYYZZZZ"

HttpClient client;
HttpGet get;
HttpResponse res;
HttpEntity ent;
Button b;
TextView tv1,tv2,tv3;
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Typeface tp=Typeface.createFromAsset(getAssets(), "AftaSansThin-Regular.otf");
    StrictMode.enableDefaults();
    b = (Button) findViewById(R.id.button1);
    tv1 = (TextView) findViewById(R.id.textView1);
    tv2 = (TextView) findViewById(R.id.textView2);
    tv3 = (TextView) findViewById(R.id.textView3);
    tv1.setTypeface(tp);
    tv2.setTypeface(tp);
    tv3.setTypeface(tp);
    client = new DefaultHttpClient();
    get = new HttpGet("http://example.com");
    b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            try {
                res=client.execute(get);
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            ent=res.getEntity();
            InputStream is = null;
            try {
                is=ent.getContent();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            StringBuffer sb = new StringBuffer();
            String line = null;
            do{
                try {
                    line = br.readLine();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                sb.append(line);
            } while (line!=null);
            String str = sb.toString();

            try {
                JSONObject ob1 = new JSONObject(str);
                JSONObject ob2 = ob1.getJSONObject("post");
                String title = ob2.getString("title");
                String date = ob2.getString("date");
                String content = ob2.getString("content");



                tv1.setText(title);
                tv2.setText(date);
                Spanned marked_up = Html.fromHtml(content);
                tv3.setText(marked_up.toString(),BufferType.SPANNABLE);

            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
}

4 个答案:

答案 0 :(得分:1)

首先,这不是一个有效的图像Url - \“http://sphotos-h.ak.fbcdn.net/hphotos-ak-ash4/395050_10151219612828815_5123523_n.jpg \”更接近你想要的但仍然拥有所有逃脱角色。

如果您可以获取JSON数据包以将URL作为字符串发送,效率会更高。如果没有配置它以便它不会转义所有字符,则从返回的文本中删除Url。

接下来,我要做的是在AsyncTask中启动http连接并获取输入流。使用BitmapFactory.decodeStream(HttpInputStream)将流转换为位图,然后将位图返回到UI线程onPostExecute。

如果您正在处理许多图像下载,您可能需要考虑开源库或编写AsyncImageLoader

希望这有助于:)

答案 1 :(得分:1)

如果你已经获得了图片网址,你可以使用这个lib从主线程加载图像异步,我只是尝试它很容易使用并且工作正常,希望它可以帮助你:https://github.com/nostra13/Android-Universal-Image-Loader

答案 2 :(得分:1)

对于HTML数据:

基于代码,我可以说你在图像中获取HTML数据,因此你可以在WebView中加载这个HTML。

对于图片网址:

正如其他人所建议的那样,只有在您获取图片网址而非HTML数据时,您才可以使用Android Universal Image LoaderLazy Loading of Images by Fedor库或any library来加载图片。

答案 3 :(得分:0)

很少有内容实际上是JSON。此内容中的“键”命名为“content”,值为第一个冒号':'后的其余部分。其余部分是常规HTML(需要使用正则表达式或其他HTML解析器拉出来)。

在javascript中,您可以做的最好的事情是:

var text = JSON.parse(content)["content"]; // which gives you everything after the colon.

但是你仍然需要一个正则表达式来拉出所有的href标签:

以下是命令行中的示例:

bash$ content="<p><img class=\"aligncenter\" style=\"cursor: -moz-zoom-in;\" src=\"http:\/\/sphotos-h.ak.fbcdn.net\/hphotos-ak-ash4\/395050_10151219612828815_5123523_n.jpg\" alt=\"http:\/\/sphotos-h.ak.fbcdn.net\/hphotos-ak-ash4\/395050_10151219612828815_5123523_n.jpg\" width=\"390\" height=\"466\" \/><\/p>\n<p><span id=\"more-5267\"><\/span><\/p>\n<p>Some texts here...XXXXXYYYYYZZZZ"

bash$ echo $content | grep -oE "(src|alt)=\"[^\"]+\.jpg\"" | sed "s/\(src=\|alt=\|\"\)//g" | sed "s/\\///g"
http:\\sphotos-h.ak.fbcdn.net\hphotos-ak-ash4\395050_10151219612828815_5123523_n.jpg
http:\\sphotos-h.ak.fbcdn.net\hphotos-ak-ash4\395050_10151219612828815_5123523_n.jpg

您可以将该正则表达式翻译成您正在使用的任何语言。