使用 Retrofit 获取 JSON

Posted

技术标签:

【中文标题】使用 Retrofit 获取 JSON【英文标题】:Using Retrofit to get JSON 【发布时间】:2014-03-14 09:58:23 【问题描述】:

我目前正在尝试使用 Retrofit 构建 Muzei 扩展,就像 Roman 在他的示例中使用的示例一样。

我无法真正理解 Retrofit,但这就是我所拥有的

ArtSource.java

public class ArtSource extends RemoteMuzeiArtSource 
    private static final String TAG = "The Muzei Collection";
    private static final String SOURCE_NAME = "The Muzei Collection";

    private static final int ROTATE_TIME_MILLIS = 3 * 60 * 60 * 1000; // rotate every 3 hours

    public ArtSource() 
        super(SOURCE_NAME);
    

    @Override
    public void onCreate() 
        super.onCreate();
        setUserCommands(BUILTIN_COMMAND_ID_NEXT_ARTWORK);
    

    @Override
    protected void onTryUpdate(int reason) throws RetryException 
        String currentToken = (getCurrentArtwork() != null) ? getCurrentArtwork().getToken() : null;

        RestAdapter restAdapter = new RestAdapter.Builder()
                .setServer("http://elliothesp.co.uk")
                .build();

        ArtService service = restAdapter.create(ArtService.class);
        PhotosResponse response = service.getPopularPhotos();

   if (response == null || response.photos == null) 
        throw new RetryException();
    

    if (response.photos.size() == 0) 
        Log.w(TAG, "No photos returned from API.");
        scheduleUpdate(System.currentTimeMillis() + ROTATE_TIME_MILLIS);
        return;
    

        Random random = new Random();
        Photo photo;
        String token;
        while (true) 
            photo = response.photos.get(random.nextInt(response.photos.size()));
            token = Integer.toString(photo.id);
            if (response.photos.size() <= 1 || !TextUtils.equals(token, currentToken)) 
                break;
            
        

        publishArtwork(new Artwork.Builder()
                .title(photo.title)
                .byline(photo.user)
                .imageUri(Uri.parse(photo.url))
                .token(token)
                .viewIntent(new Intent(Intent.ACTION_VIEW,
                        Uri.parse("http://www.google.com")))
                .build());

        scheduleUpdate(System.currentTimeMillis() + ROTATE_TIME_MILLIS);
    

ArtService.java

interface ArtService 
    @GET("/muzei.php")
    PhotosResponse getPopularPhotos();

    static class PhotosResponse 
        List<Photo> photos;
    

    static class Photo 
        int id;
        String user;
        String title;
        String url;

    

基本上,我正在尝试从http://elliothesp.co.uk/muzei.php 获取 JSON 并将每个项目传递给 publishArtwork。它运行异常,因为它无法从 JSON 提要中找到任何照片,而且我不确定如何使其正常工作

【问题讨论】:

pastebin.com/xAVp3CKs 这是整个日志吗?你的 ArtSource.java 的第 62 行是什么(没有完整列出) 你也可以尝试公开你的界面 照片 = response.photos.get(random.nextInt(response.photos.size())); 顺便说一句,从 500px.com api json 中提取的示例在这里:github.com/romannurik/muzei/tree/master/example-source-500px/… 【参考方案1】:

好吧,你的responseJSON 格式不适合你的界面,应该是:

interface service 
    @GET("/muzei.php")
    Map<String,Photo> getPopularPhotos();

    static class Photo 
        int id;
        String user;
        String title;
        String url;

    

还有response:

Map<String, Photo> response = service.getPopularPhotos();

然后在你得到response 之后重新编写你的代码来迭代它

【讨论】:

谢谢!我有一种感觉,这就是问题所在,但我并没有充分理解它。不过,您的回答让一切都​​非常清楚

以上是关于使用 Retrofit 获取 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 gson/retrofit 获取对象数组?

Android 使用retrofit时,怎样获取响应的头信息

使用 retrofit2 和 Okhttp 获取 Api

Android Studio - 使用 retrofit2 从 restdb 获取信息

无法在 Retrofit 2.0 android 中获取 json 字符串作为响应

Android 使用Retrofit获取JSON数据