如何反序列化json对象并添加对arraylist的响应

时间:2018-03-13 13:36:19

标签: android json gson retrofit

我正在使用soundcloud api创建一个应用程序,但我在解析json对象时遇到错误,我是这个东西的新手,所以不知道我在做错了什么

这是我的界面

ScService.java

public interface SCService
{
    @GET("/resolve.json?url=https://m.soundcloud.com/kshmr/sets/materia&client_id=iZIs9mchVcX5lhVRyQGGAYlNPVldzAoX")
    Call<Track> getTrack();
}

这是我的模型类

Track.java

public class Track
{   
    @SerializedName("title")
    private String mTitle;

    @SerializedName("stream_url")
    private String mStreamUrl;

    public String getTitle()
    {
        return mTitle;
    }

    public String getStreamUrl()
    {
        return mStreamUrl;
    }
}

MainActivity.class

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(Config.API_URL)
        .addConverterFactory(GsonConverterFactory.create()).build();

SCService Scservice = retrofit.create(SCService.class);
Call<Track> call = Scservice.getTrack();
    call.enqueue(new Callback<Track>(){

            @Override
            public void onResponse(Call<Track> call, Response<Track> response)
            {
                // TODO: Implement this method
                if(response.isSuccessful())
                {
                //String track = response.body().toString();
                //Log.e("jsonres",track);

                //gson = new GsonBuilder().create();
                gson = new Gson();
                Track track = gson.fromJson(response.body().toString(), Track.class);
          }

        @Override
        public void onFailure(Call p1, Throwable p2)
        {
            // TODO: Implement this method
        }
    });
}

以下是来自api callcall的JSON响应

enter code here
 {"kind":"track","id":399448641,"created_at":"2018/02/14 11:40:02 +0000","user_id":319295181,"duration":188726,"commentable":true,"state":"finished","original_content_size":33279566,"last_modified":"2018/03/10 17:33:18 +0000","sharing":"public","tag_list":"KSHMR \"House of Cards\" \"Sidnie Tipton\" Dharma \"Spinnin' \"","permalink":"houseofcards-mixmaster-05b","streamable":true,"embeddable_by":"all","purchase_url":"http://www.spinninrecords.com/releases/house-of-cards","purchase_title":"Download/Stream","label_id":null,"genre":"Dance & EDM","title":"KSHMR - House of Cards (Ft. Sidnie Tipton)","description":"KSHMR and Sidnie Tipton team up again, this time for the bittersweet sound of \"House of Cards\" \n\nDownload / Stream here: https://www.spinninrecords.com/releases/house-of-cards/","label_name":null,"release":null,"track_type":null,"key_signature":null,"isrc":null,"video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/399448641","user":{"id":319295181,"kind":"user","permalink":"dharmaworldwide","username":"Dharma Worldwide","last_modified":"2018/03/09 12:08:27 +0000","uri":"https://api.soundcloud.com/users/319295181","permalink_url":"http://soundcloud.com/dharmaworldwide","avatar_url":"https://i1.sndcdn.com/avatars-000324744374-jdrkyv-large.jpg"},"permalink_url":"https://soundcloud.com/dharmaworldwide/houseofcards-mixmaster-05b","artwork_url":"https://i1.sndcdn.com/artworks-000302088414-recq7g-large.jpg","stream_url":"https://api.soundcloud.com/tracks/399448641/stream","download_url":"https://api.soundcloud.com/tracks/399448641/download","playback_count":135077,"download_count":0,"favoritings_count":7351,"reposts_count":1354,"comment_count":120,"downloadable":false,"waveform_url":"https://w1.sndcdn.com/0Bcy6WpC8dzY_m.png","attachments_uri":"https://api.soundcloud.com/tracks/399448641/attachments","policy":"ALLOW","monetization_model":"NOT_APPLICABLE"}

我无法使用gson.fromJson(...)方法,我该怎么办呢?

Ps-I几乎改变了我的代码。

2 个答案:

答案 0 :(得分:0)

应该以这种方式使用Gson对象:

gson = new GsonBuilder().create();
Track track = gson.fromJson(response.body().toString(),Track.class);

答案 1 :(得分:0)

你应该这样做:

编辑:

<强> ScService.java

public interface SCService
{
    @GET("users/17586135/tracks?client_id=iZIs9mchVcX5lhVRyQGGAYlNPVldzAoX")
    Call<Track> getTrack();
}

<强> MainActivity.class

Call<Track> call = Scservice.getTracks();
call.enqueue(new Callback<Track>(){

        @Override
        public void onResponse(Call call, Response<Track> response)
        {
            // Get the result
            Track track = response.body();
        }

        @Override
        public void onFailure(Call p1, Throwable p2)
        {
            // TODO: Implement this method
        }
    });
}

更多here