java - 如何从 Android 中的 POJO 类获取项目?

标签 java android json pojo

我正在尝试从 Android 应用程序中的 API 获取特定项目。 以下是 api 的 JSON 响应:

{

    "response": {
        "items": [
            {
                "episode_id": 9599548,
                "type": "RECORDED",
                "title": "Adabule muferad 100916",
                "duration": 3165940,
                "explicit": false,
                "show_id": 1392538,
                "author_id": 7725967,
                "site_url": "https://www.spreaker.com/episode/9599548",
                "image_url": "https://d1bm3dmew779uf.cloudfront.net/large/f390b915e356de35055d971be5110dcb.jpg",
                "image_original_url": "https://d3wo5wojvuv7l.cloudfront.net/images.spreaker.com/original/f390b915e356de35055d971be5110dcb.jpg",
                "published_at": "2016-10-09 11:01:48",
                "download_enabled": true,
                "waveform_url": "https://d3770qakewhkht.cloudfront.net/episode_9599548.gz.json?v=qB6pQ6"
            }
        ],
        "next_url": "https://api.spreaker.com/v2/users/7725967/episodes?filter=listenable&last_id=9599548&limit=1"
    }

}

我有三个 Java 类 Items、Response 和 RadioProgramInfo。 分别是它们的代码:

项目.java

public class Items
{
    public String duration;
    public String title;
    public String download_enabled;
    public String image_original_url;
    public String image_url;
    public String explicit;
    public String episode_id;
    public String author_id;
    public String show_id;
    public String type;
    public String waveform_url;
    public String published_at;
    public String site_url;
    public String getDuration ()
    {
        return duration;
    }

    public void setDuration (String duration)
    {
        this.duration = duration;
    }

    public String getTitle ()
    {
        return title;
    }

    public void setTitle (String title)
    {
        this.title = title;
    }

    public String getDownload_enabled ()
    {
        return download_enabled;
    }

    public void setDownload_enabled (String download_enabled)
    {
        this.download_enabled = download_enabled;
    }

    public String getImage_original_url ()
    {
        return image_original_url;
    }

    public void setImage_original_url (String image_original_url)
    {
        this.image_original_url = image_original_url;
    }

    public String getImage_url ()
    {
        return image_url;
    }

    public void setImage_url (String image_url)
    {
        this.image_url = image_url;
    }

    public String getExplicit ()
    {
        return explicit;
    }

    public void setExplicit (String explicit)
    {
        this.explicit = explicit;
    }

    public String getEpisode_id ()
    {
        return episode_id;
    }

    public void setEpisode_id (String episode_id)
    {
        this.episode_id = episode_id;
    }

    public String getAuthor_id ()
    {
        return author_id;
    }

    public void setAuthor_id (String author_id)
    {
        this.author_id = author_id;
    }

    public String getShow_id ()
    {
        return show_id;
    }

    public void setShow_id (String show_id)
    {
        this.show_id = show_id;
    }

    public String getType ()
    {
        return type;
    }

    public void setType (String type)
    {
        this.type = type;
    }

    public String getWaveform_url ()
    {
        return waveform_url;
    }

    public void setWaveform_url (String waveform_url)
    {
        this.waveform_url = waveform_url;
    }

    public String getPublished_at ()
    {
        return published_at;
    }

    public void setPublished_at (String published_at)
    {
        this.published_at = published_at;
    }

    public String getSite_url ()
    {
        return site_url;
    }

    public void setSite_url (String site_url)
    {
        this.site_url = site_url;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [duration = "+duration+", title = "+title+", download_enabled = "+download_enabled+", image_original_url = "+image_original_url+", image_url = "+image_url+", explicit = "+explicit+", episode_id = "+episode_id+", author_id = "+author_id+", show_id = "+show_id+", type = "+type+", waveform_url = "+waveform_url+", published_at = "+published_at+", site_url = "+site_url+"]";
    }
}

响应.java

public class Response
{
    private Items[] items;

    private String next_url;

    public Items[] getItems ()
    {
        return items;
    }

    public void setItems (Items[] items)
    {
        this.items = items;
    }

    public String getNext_url ()
    {
        return next_url;
    }

    public void setNext_url (String next_url)
    {
        this.next_url = next_url;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [items = "+items+", next_url = "+next_url+"]";
    }
}

RadioProgramInfo.java

public class RadioProgramInfo
{
    private Response response;

    public Response getResponse ()
    {
        return response;
    }

    public void setResponse (Response response)
    {
        this.response = response;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [response = "+response+"]";
    }
}

我正在尝试访问位于 Items.java 中名为“site_url”的特定项目

我的主类中尝试访问 site_url 的代码是这样的:

Items url2 = new Items();
    String streamURL = String.valueOf(url2)+"/shoutcast?force_http=true";

//    new HttpRequestTask().execute();
//    return true;

    String url = "http://api.spreaker.com/listen/episode/9451446/shoutcast?force_http=true";
    //String url2 = Items.class.getName(site_url);

    public MainActivity() {

    }


    //System.out.println(streamURL);


    public class HttpRequestTask extends AsyncTask<Void, Void, Items> {

        protected Items doInBackground(Void... params) {
            try {
                final String url = String.valueOf(streamURL);
                RestTemplate restTemplate = new RestTemplate();
                //restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
                Items streamlink = restTemplate.getForObject(url, Items.class);
                return streamlink;
            }

            catch (Exception e) {
                Log.e("MainActivity", e.getMessage(), e);
            }
            return url2;
        }
    }

当我运行我的程序(媒体播放器应用程序)时: 它告诉我该 url 的值为空(我在程序执行时对其进行 Debug模式)。

如何正确访问我想要的 JSON 响应中的项目? 我真的被这个问题困住了。

---更新----- 以下是控制台的响应:

10-09 15:25:39.522 2586-2647/software.blackstone.com.salafimasjidradioseries E/MainActivity: 'messageConverters' must not be empty
                                                                                             java.lang.IllegalArgumentException: 'messageConverters' must not be empty
                                                                                                 at org.springframework.util.Assert.notEmpty(Assert.java:269)
                                                                                                 at org.springframework.web.client.HttpMessageConverterExtractor.<init>(HttpMessageConverterExtractor.java:53)
                                                                                                 at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:235)
                                                                                                 at software.blackstone.com.salafimasjidradioseries.MainActivity$HttpRequestTask.doInBackground(MainActivity.java:46)
                                                                                                 at software.blackstone.com.salafimasjidradioseries.MainActivity$HttpRequestTask.doInBackground(MainActivity.java:39)
                                                                                                 at android.os.AsyncTask$2.call(AsyncTask.java:295)
                                                                                                 at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                                 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
                                                                                                 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                                                 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                                                 at java.lang.Thread.run(Thread.java:818)

....完整的MainActivity代码是这样的:

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toast;

import org.springframework.web.client.RestTemplate;

import java.io.IOException;
public class MainActivity extends AppCompatActivity {

    static MediaPlayer mPlayer;
    ImageButton buttonPlay;
    ImageButton buttonStop;

    Items url2 = new Items();
    String streamURL = String.valueOf(url2)+"/shoutcast?force_http=true";

//    new HttpRequestTask().execute();
//    return true;

    String url = "http://api.spreaker.com/listen/episode/9451446/shoutcast?force_http=true";
    //String url2 = Items.class.getName(site_url);

    public MainActivity() {

    }


    //System.out.println(streamURL);


    public class HttpRequestTask extends AsyncTask<Void, Void, Items> {

        protected Items doInBackground(Void... params) {
            try {
                final String url = String.valueOf(streamURL);
                RestTemplate restTemplate = new RestTemplate();
                //restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
                Items streamlink = restTemplate.getForObject(url, Items.class);
                return streamlink;
            }

            catch (Exception e) {
                Log.e("MainActivity", e.getMessage(), e);
            }

            return url2;
        }

    }

    @Override
    protected void onStart() {
        super.onStart();
        new HttpRequestTask().execute();
    }

最佳答案

我承认没有任何使用 Spring 库进行移动开发的经验。然而,还有其他几个流行的库可供您使用,它们通常用于实现您的目标。

下面是我使用您的 DTO 类编写的示例。我通过应用程序的 build.gradle 添加了这些依赖项:

compile 'com.squareup.okhttp:okhttp:2.7.5'
compile 'com.google.code.gson:gson:2.4'
  • OkHttp 是一个用于创建和执行 HTTP 请求的库
  • Gson 是一个用于将数据编码为 json 的库

代码应该是非常不言自明的。我刚刚插入位来执行 HTTP GET 并将数据编码到 AsyncTask 内的 DTO 中。

public class MainActivity extends AppCompatActivity {

    private MediaPlayer mPlayer = new MediaPlayer();
    private OkHttpClient client = new OkHttpClient();
    private Gson gson = new Gson();

    public class HttpRequestTask extends AsyncTask<Void,Void,Items[]> {
        protected Items[] doInBackground(Void... params) {
            final Request request = new Request.Builder()
                .url("https://api.myjson.com/bins/1z98u")
                .build();

            Items[] items = null;

            try {
                final com.squareup.okhttp.Response response = client.newCall(request).execute();

                if(response.isSuccessful()) {
                    final RadioProgramInfo radioProgramInfo = gson.fromJson(response.body().charStream(), RadioProgramInfo.class);

                    items = radioProgramInfo.getResponse().getItems();

                } else {
                    throw new RuntimeException("ooops!");
                }

            } catch (Throwable t) {
                Log.e("MainActivity", t.getMessage(), t);
            }

            return items;
        }

        @Override
        protected void onPostExecute(Items[] items) {
            try {
                mPlayer.setDataSource(items[0].getSite_url());
                mPlayer.prepareAsync();

            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });

        new HttpRequestTask().execute();
    }

}

希望有帮助!

关于java - 如何从 Android 中的 POJO 类获取项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39947621/

相关文章:

java - 无需为每个元素迭代列表

java - 局部变量还没有初始化?

java - 当我尝试转到另一项 Activity 时,我的应用程序崩溃了

java - Android/Java - 覆盖

c# - 如何使用 Json.NET 重建我的类层次结构?

ajax - 如何在 Elm 客户端和 Haskell (Yesod) 服务器之间发送 JSON

java - Gradle 无法从 Nexus 存储库获取依赖项?

java - tomcat7过滤器使用了错误的过滤器类路径

java - 我收到了我认为是数组的语法错误,不知道它想要修复什么

java - 可以将 Jackson 配置为从所有字符串属性中修剪前导/尾随空格吗?