简体   繁体   中英

Android Studio org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject

I'm trying to post some data using volley to a server.

The issue seems to with an encoded string image.

On this line


 String name = namefield.getText().toString();
        String age = agefield.getText().toString();
        String gender = genderfield.getText().toString();
        String color = colorfield.getText().toString();
        String notes = notesfield.getText().toString();
        String images = encodeImage(bitmap);
        updatedetails(name, age, gender, color, notes, String.valueOf(owner), String.valueOf(id), images);

if I change image to empty string


        updatedetails(name, age, gender, color, notes, String.valueOf(owner), String.valueOf(id), "");

then than the data sends to server, which is how I know the image is the problem.

I logged the image response and this is what I get:

Strings: /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
    AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB
    AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAUAAk8DASIA
    AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
    AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
    ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
    p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
    AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
    BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
    U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
    uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+8LwX
    /wAit4a/7F/R/wD0011z/wCrH4/+hVyPgv8A5Fbw1/2L+j/+mmuuf/Vj8f8A0KuHC/7rP5f+knDh
    f91n8v8A0ksUUUV3HcFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
    AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
    RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBxPgv/kVvDX/AGL+j/8Apprr
    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

while the other data response are normal like:


Strings: red


The logcat says the problem is here:


try {
            JSONObject jsonObject = new JSONObject(result);
            Log.i("Check", result);

Here's the relevant code:

public void updatedetails(final String name, final String age, final String gender, final String color, final String notes, final String owner, final String id, final String pet_image) {

        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setCancelable(false);
        progressDialog.setMessage("Updating pet details");
        progressDialog.show();
        try {
            String url = "https://happy-paws.co.za/dogwalking/apis/v1/pet/update_pet.php";
            StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
                    new com.android.volley.Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            String result = response.toString();
//                            Log.d("zzzz","res "+result);
                            Toast.makeText(update.this, response, Toast.LENGTH_SHORT).show();
                            getDataResponse1(result);
                            Log.i("Check", result);
                            Log.i("Check", response);



                        }
                    },
                    new com.android.volley.Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Toast.makeText(update.this, error.getMessage(), Toast.LENGTH_SHORT).show();
                            Log.d("TAG", error.getMessage());


                        }
                    }) {
                @Override
                public byte[] getBody() throws com.android.volley.AuthFailureError {
                    String str = "{\"name\":\"" + name + "\",\"age\":\"" + age + "\",\"gender\":\"" + gender + "\",\"color\":\"" + color + "\",\"notes\":\"" + notes + "\",\"owner\":\"" + owner + "\",\"id\":\"" + id + "\",\"pet_image\":\"" + pet_image + "\"}";
                    return str.getBytes();
                }


                @Override
                protected Map<String, String> getParams() {
                    Map<String, String> params = new HashMap<String, String>();

//                    params.put("email",email);
//                    params.put("password",password);
                    return params;
                }

            };
            RequestQueue requestQueue = Volley.newRequestQueue(this);
            requestQueue.add(stringRequest);

        } catch (Exception e) {
            //App.handleUncaughtException(e);
        }

        progressDialog.dismiss();
    }

    public void getDataResponse1(String result) {
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setCancelable(false);
        progressDialog.setMessage("Please Wait.....");
        progressDialog.show();
        try {
            JSONObject jsonObject = new JSONObject(result);
            Log.i("Check", result);
            JSONObject current = jsonObject.getJSONObject(result);
            String message = current.getString("message");
            String name = jsonObject.isNull("name") ? null : jsonObject.getString("name");
            String age = jsonObject.isNull("age") ? null : jsonObject.getString("age");
            String gender = jsonObject.isNull("gender") ? null : jsonObject.getString("gender");
            String notes = jsonObject.isNull("notes") ? null : jsonObject.getString("notes");
            String color = jsonObject.isNull("color") ? null : jsonObject.getString("color");
//            String android_status=jsonObject.getString("android_status");
            if (message.equals("Pet was updated.")) {
                Toast.makeText(this, "" + message, Toast.LENGTH_SHORT).show();
//                updatedetails(name, age, gender, color, notes, String.valueOf(owner), String.valueOf(id), pet_image);


            } else {
                Toast.makeText(this, "" + message, Toast.LENGTH_SHORT).show();

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        progressDialog.dismiss();
    }

    private void selectImage(Context context) {
        final CharSequence[] options = {"Take Photo", "Choose from Gallery", "Cancel"};

        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle("Choose your profile picture");

        builder.setItems(options, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int item) {

                if (options[item].equals("Take Photo")) {
                    Intent takePicture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(takePicture, 0);
                } else if (options[item].equals("Choose from Gallery")) {
                    Intent pickPhoto = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    startActivityForResult(pickPhoto, 1);

                } else if (options[item].equals("Cancel")) {
                    dialog.dismiss();
                }
            }
        });
        builder.show();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_CANCELED) {
            switch (requestCode) {
                case 0:
                    if (resultCode == RESULT_OK && data != null) {
                        bitmap = (Bitmap) data.getExtras().get("data");
                        profilepic.setImageBitmap(bitmap);
                        encodeImage(bitmap);

                    }
                    break;
                case 1:
                    if (resultCode == RESULT_OK) {
                        bitmap = (Bitmap) data.getExtras().get("data");
                        Uri selectedImage = data.getData();
                        try {

                            InputStream inputStream = getContentResolver().openInputStream(selectedImage);
                            bitmap = BitmapFactory.decodeStream(inputStream);
                            profilepic.setImageBitmap(bitmap);
                            encodeImage(bitmap);
//                            Glide.clear(profilepic);
                        } catch (FileNotFoundException e) {


                            Toast.makeText(update.this, "Pet added succesfully", Toast.LENGTH_SHORT).show();
                        }
                        break;
                    }
            }
        }
    }
    
    public String encodeImage(Bitmap bitmap) {
        ByteArrayOutputStream ba = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ba);
        byte[] imagebyte = ba.toByteArray();
        encode = android.util.Base64.encodeToString(imagebyte, Base64.DEFAULT);
        return encode;
    }



And then where I submit:

        updatebutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
        String name = namefield.getText().toString();
        String age = agefield.getText().toString();
        String gender = genderfield.getText().toString();
        String color = colorfield.getText().toString();
        String notes = notesfield.getText().toString();
        String images = encodeImage(bitmap);
        updatedetails(name, age, gender, color, notes, String.valueOf(owner), String.valueOf(id), images);
        Log.d("Strings",images );
       Log.d("Strings",color );

image response is ok. you must set image data type as LONGTEXT or LONGBLOB on database server. but a better solution is to use Multipart Image Upload for upload image on server. you can try with Uploading Images to Server android

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM