Question

I've get an exception stackoverflow error while trying to load my Json into my class on JellyBean devices, BUT on ICS it works completely fine, is it a bug?

JSON

{
  "user": {

     "id": 216,
     "city_id": 30910,
     "city_name": "Edinburgh",
     "country_id": 482,
     "country_name": "United Kingdom",
     "email": "q@q.com",
     "username": "q@q.com",
     "name": "Alex",
     "surname": "Qwerty",
     "gender": "male",
     "send_emails": 1,
     "birthday": 969483600,
     "interests": "burns, wiskey, beer",
     "categories": [
         {
            "id": 11,
            "name": "Art",
            "icon": "http://my_icon.png",
            "subcategories": [
                {
                    "id": 39,
                    "name": "Graphic"
                }
            ]
        }
    ]
}

}

My Class

public class User implements Serializable, Cloneable{
public final static String MALE = "male";
public final static String FEMALE = "female";
public int id;
public int city_id;
public String city_name="";
public int country_id;
public String country_name="";
public String email="";
public String username="";
public String name="";
public String surname="";
public String gender="";
public int send_emails;
public Long birthday;
public String interests="";
public int fb_id;
public int vk_id;
public String plain_password="";

public ArrayList<Category> categories;

@Override
public User clone() throws CloneNotSupportedException {
    return (User)super.clone();
  }
}

public class Category {
public int id;
public String name;
public String icon;
public BitmapDrawable iconBitmap;
public ArrayList<SubCategory> subcategories;
public int checkedSubCategoriesCount;
public int changedSubCategoriesCount;

public boolean equalCategory(Category mCategory) {
    return id == mCategory.id;
}
}

public class SubCategory {
public int id;
public String name;
public boolean isChecked;
public boolean isChanged;

public boolean equalCategory(SubCategory mCategory) {
    return id == mCategory.id;
}
 }

Method

public void getCurrentUser(final AuthToken token, final LoadCompleteListener listener) {
    if (listener != null) {
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    URL url = new  URL(mURL_API.concat(SysUtilHelper.getDeviceLanguage() + "/user?token=" + token.token));
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestProperty("Connection", "close");
                    conn.connect();
                    if (getResponseCode(conn) == HttpURLConnection.HTTP_OK) {
                        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                        JsonObject request = (JsonObject) mJparser.parse(in.readLine());
                        in.close();
                        if (!request.has("error")) {

                            User user = mGson.fromJson(request.getAsJsonObject("user"), new TypeToken<User>() {
                            }.getType());
                            listener.onLoadSucces(user);
                        } else {
                            listener.onLoadError(request.get("message").toString());
                        }
                        conn.disconnect();
                    } else {
                        int responseCode = conn.getResponseCode();
                        conn.disconnect();
                        throw new NetworkException(ERROR_BAD_REQUEST + responseCode);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    listener.onLoadError(e.toString());
                }

            }
        }).start();

    }
}

P.S. I'm using gson 2.2.4

UPDATE

here is my logcat

04-22 01:37:12.415: E/AndroidRuntime(807): FATAL EXCEPTION: Thread-79
04-22 01:37:12.415: E/AndroidRuntime(807): java.lang.StackOverflowError
04-22 01:37:12.415: E/AndroidRuntime(807):  at    com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:371)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:380)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:375)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:380)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:375)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:380)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:375)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:380)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:375)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:380)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:375)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:380)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:375)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:380)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:375)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:380)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:375)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:380)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:375)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:380)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:375)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:380)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:375)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:380)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:375)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:380)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:375)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:380)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.$Gson$Types.resolve($Gson$Types.java:355)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTyp eAdapterFactory.java:117)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.Gson.getAdapter(Gson.java:356)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.Gson.getAdapter(Gson.java:356)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.Gson.getAdapter(Gson.java:356)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
04-22 01:37:12.415: E/AndroidRuntime(807):  at com.google.gsonfixed.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeA
Was it helpful?

Solution

I think the problem in BufferedReader

 {
        InputStream is = conn.getInputStream();
        InputStreamReader isr = new InputStreamReader(is,"UTF8");
        BufferedReader br=new BufferedReader(isr);
        String read;
        StringBuffer sb = new StringBuffer();
        while((read = br.readLine()) != null) {
            sb.append(read);
        }
        br.close();
        sb.toString();

}

Also try to use function fromJson(JsonObject, User.class)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top