Java 解析改装响应。body()

Java 解析改装响应。body(),java,android,json,rest,retrofit,Java,Android,Json,Rest,Retrofit,我在改装方面遇到了困难,因为我试图理解在返回的响应.body()中应该看到什么 我想我的JSON到POJO转换中有一个映射错误,因为我在将它打印到日志时没有看到正确的响应 以下是我看到的回应: V/RESPONSE_BODY: response:com.troychuinard.flickr_test.Model.Model@36b2e4c9 我希望这个响应只是JSON数据。我知道我正在正确地调用FlickR,因为我正在使用日志拦截器查看JSON: https://api.flickr.com

我在改装方面遇到了困难,因为我试图理解在返回的
响应.body()
中应该看到什么

我想我的JSON到POJO转换中有一个映射错误,因为我在将它打印到日志时没有看到正确的响应

以下是我看到的回应:

V/RESPONSE_BODY: response:com.troychuinard.flickr_test.Model.Model@36b2e4c9
我希望这个响应只是JSON数据。我知道我正在正确地调用FlickR,因为我正在使用日志拦截器查看JSON:

https://api.flickr.com/services/rest/?method=flickr.photos.getRecent&api_key=1c448390199c03a6f2d436c40defd90e&format=json&nojsoncallback=1&extras=url_m&text=test
型号:

public class Model {

Photos photos;
int code;
String stat;
String message; // when you text = null

public class Photos {

    @SerializedName("page")
    @Expose
    private int page;
    @SerializedName("pages")
    @Expose
    private int pages;
    @SerializedName("perpage")
    @Expose
    private int perpage;
    @SerializedName("total")
    @Expose
    private String total;
    @SerializedName("photo")
    @Expose
    private List<Photo> photo = new ArrayList<Photo>();

    /**
     * @return The page
     */
    public int getPage() {
        return page;
    }

    /**
     * @param page The page
     */
    public void setPage(int page) {
        this.page = page;
    }

    /**
     * @return The pages
     */
    public int getPages() {
        return pages;
    }

    /**
     * @param pages The pages
     */
    public void setPages(int pages) {
        this.pages = pages;
    }

    /**
     * @return The perpage
     */
    public int getPerpage() {
        return perpage;
    }

    /**
     * @param perpage The perpage
     */
    public void setPerpage(int perpage) {
        this.perpage = perpage;
    }

    /**
     * @return The total
     */
    public String getTotal() {
        return total;
    }

    /**
     * @param total The total
     */
    public void setTotal(String total) {
        this.total = total;
    }

    /**
     * @return The photo
     */
    public List<Photo> getPhoto() {
        return photo;
    }

    /**
     * @param photo The photo
     */
    public void setPhoto(List<Photo> photo) {
        this.photo = photo;
    }

}

public class Photo {

    @SerializedName("id")
    @Expose
    private String id;
    @SerializedName("owner")
    @Expose
    private String owner;
    @SerializedName("secret")
    @Expose
    private String secret;
    @SerializedName("server")
    @Expose
    private String server;
    @SerializedName("farm")
    @Expose
    private int farm;
    @SerializedName("title")
    @Expose
    private String title;
    @SerializedName("ispublic")
    @Expose
    private int ispublic;
    @SerializedName("isfriend")
    @Expose
    private int isfriend;
    @SerializedName("isfamily")
    @Expose
    private int isfamily;
    @SerializedName("url_m")
    @Expose
    private String urlM;
    @SerializedName("height_m")
    @Expose
    private String heightM;
    @SerializedName("width_m")
    @Expose
    private String widthM;

    public Photo(){

    }

    /**
     * @return The id
     */
    public String getId() {
        return id;
    }

    /**
     * @param id The id
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * @return The owner
     */
    public String getOwner() {
        return owner;
    }

    /**
     * @param owner The owner
     */
    public void setOwner(String owner) {
        this.owner = owner;
    }

    /**
     * @return The secret
     */
    public String getSecret() {
        return secret;
    }

    /**
     * @param secret The secret
     */
    public void setSecret(String secret) {
        this.secret = secret;
    }

    /**
     * @return The server
     */
    public String getServer() {
        return server;
    }

    /**
     * @param server The server
     */
    public void setServer(String server) {
        this.server = server;
    }

    /**
     * @return The farm
     */
    public int getFarm() {
        return farm;
    }

    /**
     * @param farm The farm
     */
    public void setFarm(int farm) {
        this.farm = farm;
    }

    /**
     * @return The title
     */
    public String getTitle() {
        return title;
    }

    /**
     * @param title The title
     */
    public void setTitle(String title) {
        this.title = title;
    }

    /**
     * @return The ispublic
     */
    public int getIspublic() {
        return ispublic;
    }

    /**
     * @param ispublic The ispublic
     */
    public void setIspublic(int ispublic) {
        this.ispublic = ispublic;
    }

    /**
     * @return The isfriend
     */
    public int getIsfriend() {
        return isfriend;
    }

    /**
     * @param isfriend The isfriend
     */
    public void setIsfriend(int isfriend) {
        this.isfriend = isfriend;
    }

    /**
     * @return The isfamily
     */
    public int getIsfamily() {
        return isfamily;
    }

    /**
     * @param isfamily The isfamily
     */
    public void setIsfamily(int isfamily) {
        this.isfamily = isfamily;
    }

    /**
     * @return The urlM
     */
    public String getUrlM() {
        return urlM;
    }

    /**
     * @param urlM The url_m
     */
    public void setUrlM(String urlM) {
        this.urlM = urlM;
    }

    /**
     * @return The heightM
     */
    public String getHeightM() {
        return heightM;
    }

    /**
     * @param heightM The height_m
     */
    public void setHeightM(String heightM) {
        this.heightM = heightM;
    }

    /**
     * @return The widthM
     */
    public String getWidthM() {
        return widthM;
    }

    /**
     * @param widthM The width_m
     */
    public void setWidthM(String widthM) {
        this.widthM = widthM;
    }

    }

}
{
  photos: {
  page: 1,
  pages: 3683,
  perpage: 100,
  total: "368270",
  photo: [
       {
       id: "29264707352",
       owner: "84316756@N02",
       secret: "9ed355a86e",
       server: "8603",
       farm: 9,
       title: "Tercer Patio de los Claustros de la Compañía/ Arequipa",
       ispublic: 1,
       isfriend: 0,
       isfamily: 0,
       url_m:          "https://farm9.staticflickr.com/8603/29264707352_9ed355a86e.jpg",
       height_m: "500",
       width_m: "333"
          },
        {
        id: "29339070436",
        owner: "146617764@N02",
        secret: "b52f1e9914",
        server: "8509",
        farm: 9,
        title: "2016-04-17 09.24.07",
        ispublic: 1,
        isfriend: 0,
        isfamily: 0,
        url_m: "https://farm9.staticflickr.com/8509/29339070436_b52f1e9914.jpg",
        height_m: "281",
        width_m: "500"
       },
LOGCAT

09-03 15:11:33.037 1846-1846/com.troychuinard.flickr_test E/AndroidRuntime: FATAL EXCEPTION: main
                                                                            Process: com.troychuinard.flickr_test, PID: 1846
                                                                            java.lang.NullPointerException: println needs a message
                                                                                at android.util.Log.println_native(Native Method)
                                                                                at android.util.Log.v(Log.java:118)
                                                                                at com.troychuinard.flickr_test.MainActivity$1$1.onResponse(MainActivity.java:72)
                                                                                at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
                                                                                at android.os.Handler.handleCallback(Handler.java:739)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                at android.os.Looper.loop(Looper.java:135)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
09-03 15:14:21.858 1846-1846/com.troychuinard.flickr_test I/Process: Sending signal. PID: 1846 SIG: 9
第72行

Log.v("RESPONSE_BODY", response.body().getTotal());
活动

public class MainActivity extends AppCompatActivity {

    private EditText mSearchTerm;
    private Button mRequestButton;
    private Button mSearchButton;
    private String mQuery;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mSearchTerm = (EditText) findViewById(R.id.ediText_search_term);
        mRequestButton = (Button) findViewById(R.id.request_button);
        mSearchButton = (Button) findViewById(R.id.search_button_flickr);
        mRequestButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mQuery = mSearchTerm.getText().toString();
                HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
                interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
                OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl("https://api.flickr.com/services/rest/")
                        .client(client)
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();


                ApiInterface apiInterface = retrofit.create(ApiInterface.class);
                Call<Photos> call = apiInterface.getImages(mQuery);
                call.enqueue(new Callback<Photos>() {
                    @Override
                    public void onResponse(Call<Photos> call, Response<Photos> response) {
                        Log.v("RESPONSE_CALLED", "ON_RESPONSE_CALLED");
                        String didItWork = String.valueOf(response.isSuccessful());
                        Log.v("SUCCESS?", didItWork);
                        Log.v("RESPONSE_CODE", String.valueOf(response.code()));
                        Photos photos = response.body();
                        Log.v("RESPONSE_BODY", "response:" + photos);
                        String total = response.body().getTotal();
                        Log.v("Total", total);
                        List<Photos.Photo> photoResults = response.body().getPhoto();
                        for (Photos.Photo photo : photoResults) {
                            Log.v("PHOTO_URL:", photo.getTitle()
                            );
                        }


                    }

                    @Override
                    public void onFailure(Call<Photos> call, Throwable t) {

                    }
                });
            }
        });

        mSearchButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent toSearch = new Intent(MainActivity.this, FlickRActivity.class);
                startActivity(toSearch);
            }
        });


    }

    //Synchronous vs. Asynchronous
    public interface ApiInterface {

        @GET("?method=flickr.photos.search&api_key=1c448390199c03a6f2d436c40defd90e&format=json&nojsoncallback=1&extras=url_m")
        Call<Photos> getImages(@Query("text") String query);

    }

}
public类MainActivity扩展了AppCompatActivity{
私用编辑文本;
私人按钮mRequestButton;
专用按钮mSearchButton;
私有字符串mQuery;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSearchTerm=(EditText)findViewById(R.id.EditText\u search\u term);
mRequestButton=(按钮)findViewById(R.id.request_按钮);
mSearchButton=(Button)findViewById(R.id.search\u Button\u flickr);
mRequestButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
mQuery=msearchter.getText().toString();
HttpLoggingInterceptor拦截器=新的HttpLoggingInterceptor();
拦截器.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient客户端=新建OkHttpClient.Builder().addInterceptor(拦截器).build();
改装改装=新改装.Builder()
.baseUrl(“https://api.flickr.com/services/rest/")
.客户(客户)
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiInterface ApiInterface=reformation.create(ApiInterface.class);
Call Call=apinterface.getImages(mQuery);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
Log.v(“调用响应”、“调用响应”);
String didItWork=String.valueOf(response.issusccessful());
Log.v(“成功?”,didItWork);
Log.v(“RESPONSE_CODE”,String.valueOf(RESPONSE.CODE());
Photos=response.body();
Log.v(“回复体”,“回复:+照片”);
字符串总数=response.body().getTotal();
对数v(“总计”,总计);
List photoResults=response.body().getPhoto();
用于(照片。照片:照片结果){
Log.v(“PHOTO_URL:,PHOTO.getTitle()
);
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
});
}
});
mSearchButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Intent-toSearch=新的Intent(MainActivity.this、FlickRActivity.class);
星触觉(toSearch);
}
});
}
//同步与异步
公共接口{
@GET(“?method=flickr.photos.search&api_key=1c448390199c03a6f2d436c40defd90e&format=json&nojsoncallback=1&extras=url_m”)
调用getImages(@Query(“text”)字符串查询);
}
}

我想我的JSON到POJO转换中有一个映射错误 是的,您是对的,JSON到POJO的转换有问题。我已经根据您的Json响应创建了POJO

主类或根类,我命名为“Flicker”,然后“Flicker”类包含类“Photos”的另一个属性,“Photos”包含类Photo的对象列表

这是课程

Flicker.java

public class Flicker {

    private Photos photos;
    private String stat;

    public Photos getPhotos() {
        return photos;
    }

    public void setPhotos(Photos photos) {
        this.photos = photos;
    }

    public String getStat() {
        return stat;
    }

    public void setStat(String stat) {
        this.stat = stat;
    }

}
public class Photos {

    private Integer page;
    private Integer pages;
    private Integer perpage;
    private Integer total;
    private List<Photo> photo = new ArrayList<Photo>();

    public Integer getPage() {
        return page;
    }

    public void setPage(Integer page) {
        this.page = page;
    }


    public Integer getPages() {
        return pages;
    }

    public void setPages(Integer pages) {
        this.pages = pages;
    }


    public Integer getPerpage() {
        return perpage;
    }


    public void setPerpage(Integer perpage) {
        this.perpage = perpage;
    }

    public Integer getTotal() {
        return total;
    }

    public void setTotal(Integer total) {
        this.total = total;
    }


    public List<Photo> getPhoto() {
        return photo;
    }

    public void setPhoto(List<Photo> photo) {
        this.photo = photo;
    }

}
public class Photo {

    private String id;
    private String owner;
    private String secret;
    private String server;
    private Integer farm;
    private String title;
    private Integer ispublic;
    private Integer isfriend;
    private Integer isfamily;
    private String url_m;
    private String height_m;
    private String width_m;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getOwner() {
        return owner;
    }

    public void setOwner(String owner) {
        this.owner = owner;
    }

    public String getSecret() {
        return secret;
    }

    public void setSecret(String secret) {
        this.secret = secret;
    }


    public String getServer() {
        return server;
    }


    public void setServer(String server) {
        this.server = server;
    }

    public Integer getFarm() {
        return farm;
    }

    public void setFarm(Integer farm) {
        this.farm = farm;
    }

    public String getTitle() {
        return title;
    }


    public void setTitle(String title) {
        this.title = title;
    }
    public Integer getIspublic() {
        return ispublic;
    }


    public void setIspublic(Integer ispublic) {
        this.ispublic = ispublic;
    }


    public Integer getIsfriend() {
        return isfriend;
    }

    public void setIsfriend(Integer isfriend) {
        this.isfriend = isfriend;
    }


    public Integer getIsfamily() {
        return isfamily;
    }


    public void setIsfamily(Integer isfamily) {
        this.isfamily = isfamily;
    }


    public String getUrl_m() {
        return url_m;
    }

    public void setUrl_m(String url_m) {
        this.url_m = url_m;
    }


    public String getHeight_m() {
        return height_m;
    }


    public void setHeight_m(String height_m) {
        this.height_m = height_m;
    }


    public String getWidth_m() {
        return width_m;
    }


    public void setWidth_m(String width_m) {
        this.width_m = width_m;
    }

}
Photos.java

public class Flicker {

    private Photos photos;
    private String stat;

    public Photos getPhotos() {
        return photos;
    }

    public void setPhotos(Photos photos) {
        this.photos = photos;
    }

    public String getStat() {
        return stat;
    }

    public void setStat(String stat) {
        this.stat = stat;
    }

}
public class Photos {

    private Integer page;
    private Integer pages;
    private Integer perpage;
    private Integer total;
    private List<Photo> photo = new ArrayList<Photo>();

    public Integer getPage() {
        return page;
    }

    public void setPage(Integer page) {
        this.page = page;
    }


    public Integer getPages() {
        return pages;
    }

    public void setPages(Integer pages) {
        this.pages = pages;
    }


    public Integer getPerpage() {
        return perpage;
    }


    public void setPerpage(Integer perpage) {
        this.perpage = perpage;
    }

    public Integer getTotal() {
        return total;
    }

    public void setTotal(Integer total) {
        this.total = total;
    }


    public List<Photo> getPhoto() {
        return photo;
    }

    public void setPhoto(List<Photo> photo) {
        this.photo = photo;
    }

}
public class Photo {

    private String id;
    private String owner;
    private String secret;
    private String server;
    private Integer farm;
    private String title;
    private Integer ispublic;
    private Integer isfriend;
    private Integer isfamily;
    private String url_m;
    private String height_m;
    private String width_m;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getOwner() {
        return owner;
    }

    public void setOwner(String owner) {
        this.owner = owner;
    }

    public String getSecret() {
        return secret;
    }

    public void setSecret(String secret) {
        this.secret = secret;
    }


    public String getServer() {
        return server;
    }


    public void setServer(String server) {
        this.server = server;
    }

    public Integer getFarm() {
        return farm;
    }

    public void setFarm(Integer farm) {
        this.farm = farm;
    }

    public String getTitle() {
        return title;
    }


    public void setTitle(String title) {
        this.title = title;
    }
    public Integer getIspublic() {
        return ispublic;
    }


    public void setIspublic(Integer ispublic) {
        this.ispublic = ispublic;
    }


    public Integer getIsfriend() {
        return isfriend;
    }

    public void setIsfriend(Integer isfriend) {
        this.isfriend = isfriend;
    }


    public Integer getIsfamily() {
        return isfamily;
    }


    public void setIsfamily(Integer isfamily) {
        this.isfamily = isfamily;
    }


    public String getUrl_m() {
        return url_m;
    }

    public void setUrl_m(String url_m) {
        this.url_m = url_m;
    }


    public String getHeight_m() {
        return height_m;
    }


    public void setHeight_m(String height_m) {
        this.height_m = height_m;
    }


    public String getWidth_m() {
        return width_m;
    }


    public void setWidth_m(String width_m) {
        this.width_m = width_m;
    }

}
我以不同的方式创建了改造客户机,这就是我所做的,在代码的onClick方法中

 mQuery = mSearchTerm.getText().toString();
Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.flickr.com/services/rest/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        ApiInterface apiInterface = retrofit.create(ApiInterface.class);
        Call<Flicker> call = apiInterface.getImages(mQuery);

        call.enqueue(new Callback<Flicker>() {
            @Override
            public void onResponse(Call<Flicker> call, Response<Flicker> response) {
                Log.v("RESPONSE_CALLED", "ON_RESPONSE_CALLED");
                String didItWork = String.valueOf(response.isSuccessful());
                Log.v("SUCCESS?", didItWork);
                Log.v("RESPONSE_CODE", String.valueOf(response.code()));
                Flicker flicker_photos = response.body();
                Log.v("RESPONSE_BODY", "response:" + flicker_photos);
                String total = response.body().getPhotos().getTotal().toString();
                Log.v("Total", total);
                List<Photo> photoResults = response.body().getPhotos().getPhoto();
                for (Photo photo : photoResults) {
                    Log.v("PHOTO_URL:", photo.getTitle()
                    );
                }

            }

            @Override
            public void onFailure(Call<Flicker> call, Throwable t) {

            }
        });

一切正常。希望能有帮助。请告诉我您的问题是否已解决

一切正常。这仅仅是一个映射错误,到底是什么错误?我花了一段时间才弄明白。我注意到的唯一问题是,在循环浏览照片:photoResults时,我返回一些结果,然后得到一个空指针。尝试搜索“勒布朗·詹姆斯”,如果你撞车,请告诉我。