0

I am trying to parse a JSON response from FlickR, however I am having difficulty. I have ran some tests, and I am receiving a response code of 200 and am able to view the actual JSON using the logging interceptor.

However, I am receiving a null pointer when I try to access the JSON object. I have a feeling it has to do with my mapping / JSON to POJO:

**Model:**

Photos:

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;
  }

}

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;

/**
 * @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;
}

}

JSON Response:

{
  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

Line 72

         Log.v("RESPONSE_BODY", response.body().getTotal());
8
  • show us your logcat Commented Sep 3, 2016 at 19:31
  • NullPointerException occur in time of Log message when your message is null. Use a try catch before Logging message. Commented Sep 3, 2016 at 20:01
  • Can you further explain what the try/catch will do? New to using it Commented Sep 3, 2016 at 20:05
  • Check javatpoint.com/try-catch-block this Commented Sep 3, 2016 at 20:12
  • Got it....but what exception am I catching or hoping to catch? Commented Sep 3, 2016 at 20:13

1 Answer 1

2

Your POJO class is not fit to server response so your body is Null. Your model should be like below:

public class Model {

    // I guess it should be List too -> List<Photos>
    // your response is not complete to see 
    Photos photos;


    public class Photos{
        int page;
        int pages;
        int perpage;
        int total;
        List<Photo> photo;


        //this photo class is inner class of Photos
        public class Photo{
            String id;
            String owner;
            String secret;
            //rest of things

        }
    }
}
Sign up to request clarification or add additional context in comments.

7 Comments

I am confused why you have "Model" as the root class. Why not just make the root Photos?
@tccpg288 rest of your response is not attached and I guess you have List<Photos> so I put it in Model. it's not necessary.
Thanks, what about all of the annotations I have? Are those necessary? I read them from another source but wasn't sure if they were accurate.
@tccpg288 If you use retrofit and GsonConverter() they're not necessary; ( But don't forget if you remove @ SerializedName then your class attribute and server response should be the same. Also recommend to see following pattern stackoverflow.com/questions/36960627/android-retrofit-design-patterns/36963162#36963162
Much appreciated, can you briefly explain how my POJO class differs from yours?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.