capacitor icon indicating copy to clipboard operation
capacitor copied to clipboard

[Bug]: HttpRequestHandler.java for Android has parseJSON Exception problem

Open jaehyeong-gobox opened this issue 1 year ago • 2 comments
trafficstars

Capacitor Version

💊 Capacitor Doctor 💊

Latest Dependencies:

@capacitor/cli: 5.7.4 @capacitor/core: 5.7.4 @capacitor/android: 5.7.4 @capacitor/ios: 5.7.4

Installed Dependencies:

@capacitor/cli: 5.7.4 @capacitor/android: 5.7.4 @capacitor/core: 5.7.4 @capacitor/ios: 5.7.4

[success] iOS looking great! 👌 [success] Android looking great! 👌

Other API Details

No response

Platforms Affected

  • [ ] iOS
  • [X] Android
  • [ ] Web

Current Behavior

when get JSON-return from api in android and it contains 10 or more digits value( >2,147,483,647), it will produce java.lang.NumberFormatException problem.

2024-04-15 11:04:44.414 20170-20442 Capacitor/Plugin        ionic.myapp                         E  For input string: "8000010570"
                                                                                                    java.lang.NumberFormatException: For input string: "8000010570"
                                                                                                    	at java.lang.Integer.parseInt(Integer.java:797)
                                                                                                    	at java.lang.Integer.parseInt(Integer.java:915)
                                                                                                    	at com.getcapacitor.plugin.util.HttpRequestHandler.parseJSON(HttpRequestHandler.java:324)
                                                                                                    	at com.getcapacitor.plugin.util.HttpRequestHandler.readData(HttpRequestHandler.java:252)
                                                                                                    	at com.getcapacitor.plugin.util.HttpRequestHandler.buildResponse(HttpRequestHandler.java:222)
                                                                                                    	at com.getcapacitor.plugin.util.HttpRequestHandler.request(HttpRequestHandler.java:431)
                                                                                                    	at com.getcapacitor.plugin.CapacitorHttp$1.run(CapacitorHttp.java:66)
                                                                                                    	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:487)
                                                                                                    	at java.util.concurrent.FutureTask.run(FutureTask.java:264)
                                                                                                    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
                                                                                                    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
                                                                                                    	at java.lang.Thread.run(Thread.java:1012)

Expected Behavior

in https://github.com/ionic-team/capacitor/blob/main/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java

there's parseJSON


    public static Object parseJSON(String input) throws JSONException {
        JSONObject json = new JSONObject();
        try {
            if ("null".equals(input.trim())) {
                return JSONObject.NULL;
            } else if ("true".equals(input.trim())) {
                return true;
            } else if ("false".equals(input.trim())) {
                return false;
            } else if (input.trim().length() <= 0) {
                return "";
            } else if (input.trim().matches("^\".*\"$")) {
                // a string enclosed in " " is a json value, return the string without the quotes
                return input.trim().substring(1, input.trim().length() - 1);
            } else if (input.trim().matches("^-?\\d+$")) { // * * * * * * * * * * * * HERE * * * * * * * * * * *
                return Integer.parseInt(input.trim());
            } else if (input.trim().matches("^-?\\d+(\\.\\d+)?$")) {
                return Double.parseDouble(input.trim());
            } else {
                try {
                    return new JSObject(input);
                } catch (JSONException e) {
                    return new JSArray(input);
                }
            }
        } catch (JSONException e) {
            return input;
        }
    }

maybe we can use BigInt or change the if regex part?

Project Reproduction

https://github.com/ionic-team/capacitor/blob/main/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java

Additional Information

No response

jaehyeong-gobox avatar Apr 15 '24 02:04 jaehyeong-gobox

This issue needs more information before it can be addressed. In particular, the reporter needs to provide a minimal sample app that demonstrates the issue. If no sample app is provided within 15 days, the issue will be closed. Please see the Contributing Guide for how to create a Sample App. Thanks! Ionitron 💙

ionitron-bot[bot] avatar Apr 15 '24 12:04 ionitron-bot[bot]

Same here with bigInt on json file using v8.x!

meriturva avatar Apr 29 '24 15:04 meriturva

It looks like this issue didn't get the information it needed, so I'll close it for now. If I made a mistake, sorry! I am just a bot.

Have a great day! Ionitron 💙

Ionitron avatar May 15 '24 00:05 Ionitron

Thanks for the issue! This issue is being locked to prevent comments that are not relevant to the original issue. If this is still an issue with the latest version of Capacitor, please create a new issue and ensure the template is fully filled out.

ionitron-bot[bot] avatar Jun 14 '24 00:06 ionitron-bot[bot]