简体   繁体   中英

How to fix java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ with correct JSON form

I have this code in my Activity :

package com.salammedindonesia.ptsalammeddeviceindonesia.activities;

import android.Manifest;
import android.app.ProgressDialog;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.salammedindonesia.ptsalammeddeviceindonesia.R;
import com.salammedindonesia.ptsalammeddeviceindonesia.adapters.ImageBarangRecyclerAdapter;
import com.salammedindonesia.ptsalammeddeviceindonesia.models.AddResponse;
import com.salammedindonesia.ptsalammeddeviceindonesia.networks.ApiService;
import com.salammedindonesia.ptsalammeddeviceindonesia.networks.InternetConnection;
import com.salammedindonesia.ptsalammeddeviceindonesia.networks.RetrofitConfig;
import com.salammedindonesia.ptsalammeddeviceindonesia.utils.FileUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class PermohonanPenawaranActivity extends AppCompatActivity {

    @BindView(R.id.company_profile_text_view)
    TextView companyProfileTextView;
    @BindView(R.id.text_spinner_customer)
    TextView textSpinnerCustomer;
    @BindView(R.id.spinner_customer)
    Spinner spinnerCustomer;

    @BindView(R.id.edit_text_keterangan)
    EditText editTextKeterangan;
    @BindView(R.id.edit_text_nama_pemesan)
    EditText editTextNamaPemesan;
    @BindView(R.id.edit_text_jabatan_pemesan)
    EditText editTextJabatanPemesan;
    @BindView(R.id.edit_text_pemesan_phone)
    EditText editTextPemesanPhone;
    @BindView(R.id.edit_text_pemesan_email)
    EditText editTextPemesanEmail;

    @BindView(R.id.image_view_npwp)
    ImageView imageViewNpwp;
    @BindView(R.id.text_view_nama_file_npwp)
    TextView textViewNamaFileNpwp;

    @BindView(R.id.button_select_image)
    Button buttonSelectImage;
    @BindView(R.id.recycler_image_upload)
    RecyclerView recyclerImageUpload;
    @BindView(R.id.button_submit_permohonan)
    Button buttonSubmitPermohonan;

    private static final String TAG = PermohonanPenawaranActivity.class.getSimpleName();
    private static final int REQUEST_CODE = 6384;
    private static final int REQUEST_CODE_ASK_PERMISSIONS = 124;

    private ProgressDialog mProgressBar;
    private List<Uri> uriList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_permohonan_penawaran);
        ButterKnife.bind(this);
        mProgressBar = new ProgressDialog(PermohonanPenawaranActivity.this);
        uriList = new ArrayList<>();
        getCustomerData();
    }

    @OnClick({R.id.company_profile_text_view, R.id.text_spinner_customer, R.id.button_select_image, R.id.button_submit_permohonan})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.company_profile_text_view:
                break;
            case R.id.text_spinner_customer:
                break;
            case R.id.button_select_image:
                if (askForPermission())
                    showChooser();
                break;
            case R.id.button_submit_permohonan:
                addNewRequestPesananBarang();
                break;
        }
    }

    private void getCustomerData() {

    }

    private void addNewRequestPesananBarang() {
        ApiService apiService = RetrofitConfig.getInitRetrofit();
        Call<AddResponse> addResponseCall = apiService.addPesananBarang(
                1,
                editTextNamaPemesan.getText().toString(),
                editTextJabatanPemesan.getText().toString(),
                editTextPemesanPhone.getText().toString(),
                editTextPemesanEmail.getText().toString()
        );
        addResponseCall.enqueue(new Callback<AddResponse>() {
            @Override
            public void onResponse(@NonNull Call<AddResponse> call, @NonNull Response<AddResponse> response) {
                if (!Objects.requireNonNull(response.body()).isResponse()) {
                    Toast.makeText(PermohonanPenawaranActivity.this, R.string.string_some_thing_wrong, Toast.LENGTH_SHORT).show();
                } else {
                    uploadImagesToServer();
                }
            }

            @Override
            public void onFailure(@NonNull Call<AddResponse> call, @NonNull Throwable t) {
                Toast.makeText(PermohonanPenawaranActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void uploadImagesToServer() {
        if (InternetConnection.checkConnection(PermohonanPenawaranActivity.this)) {
            ApiService apiService = RetrofitConfig.getInitRetrofit();
            showProgress();

            // create list of file parts (photo, video, ...)
            List<MultipartBody.Part> parts = new ArrayList<>();

            if (uriList != null) {
                // create part for file (photo, video, ...)
                for (int i = 0; i < uriList.size(); i++) {
                    parts.add(prepareFilePart(uriList.get(i)));
                }
            }

            // finally, execute the request
            Call<AddResponse> call = apiService.uploadImageBarang(parts);

            call.enqueue(new Callback<AddResponse>() {
                @Override
                public void onResponse(@NonNull Call<AddResponse> call, @NonNull Response<AddResponse> response) {
                    Log.d("JSON : ", String.valueOf(response.body()));
                    hideProgress();
                    if (response.isSuccessful()) {
                        if (!Objects.requireNonNull(response.body()).isResponse()) {
                            Toast.makeText(PermohonanPenawaranActivity.this, R.string.string_some_thing_wrong, Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(PermohonanPenawaranActivity.this, "All data and images successfully uploaded!", Toast.LENGTH_SHORT).show();
                        }
                    }

                }

                @Override
                public void onFailure(@NonNull Call<AddResponse> call, @NonNull Throwable t) {
                    hideProgress();
                    Toast.makeText(PermohonanPenawaranActivity.this, t.getMessage(), Toast.LENGTH_LONG).show();
                    Log.d("Error : ", t.getMessage());
                }
            });

        } else {
            hideProgress();
            Toast.makeText(PermohonanPenawaranActivity.this, R.string.string_internet_connection_not_available, Toast.LENGTH_SHORT).show();
        }
    }

    private void showChooser() {
        // Use the GET_CONTENT intent from the utility class
        Intent target = FileUtils.createGetContentIntent();
        // Create the chooser Intent
        Intent intent = Intent.createChooser(
                target, getString(R.string.chooser_title));
        try {
            startActivityForResult(intent, REQUEST_CODE);
        } catch (ActivityNotFoundException e) {
            // The reason for the existence of aFileChooser
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE) {// If the file selection was successful
            if (resultCode == RESULT_OK) {
                if (data.getClipData() != null) {
                    int count = data.getClipData().getItemCount();
                    int currentItem = 0;
                    while (currentItem < count) {
                        Uri imageUri = data.getClipData().getItemAt(currentItem).getUri();
                        //do something with the image (save it to some directory or whatever you need to do with it here)
                        currentItem = currentItem + 1;
                        Log.d("Uri Selected", imageUri.toString());
                        try {
                            // Get the file path from the URI
                            String path = FileUtils.getPath(this, imageUri);
                            Log.d("Multiple File Selected", path);

                            uriList.add(imageUri);
                            recyclerImageUpload.setLayoutManager(new LinearLayoutManager(PermohonanPenawaranActivity.this));
                            recyclerImageUpload.setAdapter(new ImageBarangRecyclerAdapter(PermohonanPenawaranActivity.this, uriList));

                        } catch (Exception e) {
                            Log.e(TAG, "File select error", e);
                        }
                    }
                } else if (data.getData() != null) {
                    //do something with the image (save it to some directory or whatever you need to do with it here)
                    final Uri uri = data.getData();
                    Log.i(TAG, "Uri = " + uri.toString());
                    try {
                        // Get the file path from the URI
                        final String path = FileUtils.getPath(this, uri);
                        Log.d("Single File Selected", path);

                        uriList.add(uri);
                        recyclerImageUpload.setLayoutManager(new LinearLayoutManager(PermohonanPenawaranActivity.this));
                        recyclerImageUpload.setAdapter(new ImageBarangRecyclerAdapter(PermohonanPenawaranActivity.this, uriList));

                    } catch (Exception e) {
                        Log.e(TAG, "File select error", e);
                    }
                }
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    private void showProgress() {
        mProgressBar.show();
        mProgressBar.setMessage("Loading......");
        buttonSelectImage.setEnabled(false);
    }

    private void hideProgress() {
        mProgressBar.dismiss();
        buttonSelectImage.setEnabled(true);
    }

    @NonNull
    private MultipartBody.Part prepareFilePart(Uri fileUri) {
        // https://github.com/iPaulPro/aFileChooser/blob/master/aFileChooser/src/com/ipaulpro/afilechooser/utils/FileUtils.java
        // use the FileUtils to get the actual file by uri
        File file = FileUtils.getFile(this, fileUri);

        // create RequestBody instance from file
        RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-file"), file);

        // MultipartBody.Part is used to send also the actual file name
        return MultipartBody.Part.createFormData("upload_image_barang", file.getName(), requestFile);
    }

    private boolean askForPermission() {
        int currentAPIVersion = Build.VERSION.SDK_INT;
        if (currentAPIVersion >= Build.VERSION_CODES.M) {
            int hasCallPermission = ContextCompat.checkSelfPermission(PermohonanPenawaranActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE);
            if (hasCallPermission != PackageManager.PERMISSION_GRANTED) {
                // Ask for permission
                // need to request permission
                if (ActivityCompat.shouldShowRequestPermissionRationale(PermohonanPenawaranActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
                    // explain
                    showMessageOKCancel(
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    ActivityCompat.requestPermissions(PermohonanPenawaranActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_ASK_PERMISSIONS);
                                }
                            });
                    // if denied then working here
                } else {
                    // Request for permission
                    ActivityCompat.requestPermissions(PermohonanPenawaranActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_ASK_PERMISSIONS);
                }

                return false;
            } else {
                // permission granted and calling function working
                return true;
            }
        } else {
            return true;
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_CODE_ASK_PERMISSIONS) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission Granted
                showChooser();
            } else {
                // Permission Denied
                Toast.makeText(PermohonanPenawaranActivity.this, "Permission Denied!", Toast.LENGTH_SHORT).show();
            }
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

    private void showMessageOKCancel(DialogInterface.OnClickListener okListener) {

        AlertDialog.Builder builder = new AlertDialog.Builder(PermohonanPenawaranActivity.this);
        final AlertDialog dialog = builder.setMessage("You need to grant access to Read External Storage")
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", null)
                .create();

        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface arg0) {
                dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(
                        ContextCompat.getColor(PermohonanPenawaranActivity.this, android.R.color.holo_blue_light));
                dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(
                        ContextCompat.getColor(PermohonanPenawaranActivity.this, android.R.color.holo_red_light));
            }
        });

        dialog.show();

    }
}

Then I've set my Retrofit here :

package com.salammedindonesia.ptsalammeddeviceindonesia.networks;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitConfig {

    private static Retrofit setInitRetrofit() {
        OkHttpClient client = new OkHttpClient.Builder()
                .readTimeout(30, TimeUnit.SECONDS)
                .connectTimeout(30, TimeUnit.SECONDS)
                .build();
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();
        return new Retrofit.Builder()
                .baseUrl("http://192.168.43.103/PermohonanPenawaranHarga/Permohonan/")
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(client)
                .build();
    }

    public static ApiService getInitRetrofit() {
        return setInitRetrofit().create(ApiService.class);
    }

}

And I have this code in my ApiService interface :

package com.salammedindonesia.ptsalammeddeviceindonesia.networks;

import com.salammedindonesia.ptsalammeddeviceindonesia.models.AddImageBarangResponse;
import com.salammedindonesia.ptsalammeddeviceindonesia.models.AddResponse;

import java.util.List;

import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;


public interface ApiService {
    @Headers({"Content-Type: application/json", "Content-Type: multipart/form-data"})
    @Multipart
    @POST("addImageBarang")
    Call<AddResponse> uploadImageBarang(
            @Part List<MultipartBody.Part> upload_image_barang
    );

    @FormUrlEncoded
    @POST("addNewRequestPesananBarang")
    Call<AddResponse> addPesananBarang(
            @Field("customer_id") int customer_id,
            @Field("pemesan_name") String pemesan_name,
            @Field("pemesan_jabatan") String pemesan_jabatan,
            @Field("pemesan_phone") String pemesan_phone,
            @Field("pemesan_email") String pemesan_email
    );
}

And this is My POJO :

package com.salammedindonesia.ptsalammeddeviceindonesia.models;

import lombok.Data;

@Data
public class AddResponse {
    private boolean response;
}

Then Last, this is My API code that created with CodeIgniter framework :

This is My Controller :

<?php 
/**
 * 
 */

class Permohonan extends CI_Controller
{

    function __construct() {
        parent::__construct();
        $this->load->model('Permohonan_model');
        $this->load->helper(array('form', 'url'));
    }

    public function getCustomerData() {
        $data['customerData'] = $this->Permohonan_model->getCustomerData();
        echo json_encode($data);    
    }

    public function addImageBarang() {

        // $permohonan_id = $this->input->post('permohonan_id');

        if(!empty($_FILES['upload_image_barang']['name'])) {

            $filesCount = count($_FILES['upload_image_barang']['name']);

            for($i = 0; $i < $filesCount; $i++) { 

                $_FILES['upload_File']['name'] = $_FILES['upload_image_barang']['name'][$i]; 
                $_FILES['upload_File']['type'] = $_FILES['upload_image_barang']['type'][$i]; 
                $_FILES['upload_File']['tmp_name'] = $_FILES['upload_image_barang']['tmp_name'][$i]; 
                $_FILES['upload_File']['error'] = $_FILES['upload_image_barang']['error'][$i]; 
                $_FILES['upload_File']['size'] = $_FILES['upload_image_barang']['size'][$i]; 

                $uploadPath = './uploadImages/BarangPesanan/'; 

                $config['upload_path'] = $uploadPath; 
                $config['allowed_types'] = 'gif|jpg|png'; 

                $this->load->library('upload', $config);
                $this->upload->initialize($config);

                if($this->upload->do_upload('upload_File')) {

                    $fileData = $this->upload->data();

                    // $uploadData[$i]['permohonan_id'] = implode(",", $permohonan_id);
                    $uploadData[$i]['image_name'] = $fileData['file_name'];

                }
            } 

            if(!empty($uploadData)) {
                //Insert file information into the database
                $insertImageBarang = $this->Permohonan_model->insertImageBarang($uploadData);

                if ($insertImageBarang === TRUE) {
                    $data['response'] = true;
                    echo json_encode($data);
                } else {
                    $data['response'] = false;
                    echo json_encode($data);
                }
            }
        }
    }

    public function addNewRequestPesananBarang() {

        $customer_id = $this->input->post('customer_id');
        $pemesan_name = $this->input->post('pemesan_name');
        $pemesan_jabatan = $this->input->post('pemesan_jabatan');
        $pemesan_phone = $this->input->post('pemesan_phone');
        $pemesan_email = $this->input->post('pemesan_email');

        $pesananValue = array(
            'customer_id' => $customer_id, 
            'pemesan_name' => $pemesan_name, 
            'pemesan_jabatan' => $pemesan_jabatan, 
            'pemesan_phone' => $pemesan_phone, 
            'pemesan_email' => $pemesan_email 
        );

        $addNewRequestPesananBarang = $this->Permohonan_model->insertNewRequestPesananBarang($pesananValue);

        if ($addNewRequestPesananBarang === TRUE) {
            $data['response'] = true;
            echo json_encode($data);
        } else {
            $data['response'] = false;
            echo json_encode($data);
        }

    }

    public function addNewCustomer() {

        $customer_name = $this->input->post('customer_name');
        $customer_address = $this->input->post('customer_address');

        $customerValue = array(
            'customer_name' => $customer_name, 
            'customer_address' => $customer_address
        );

        $addNewCustomer = $this->Permohonan_model->insertNewCustomerData($customerValue);

        if ($addNewCustomer === TRUE) {
            $data['response'] = true;
            echo json_encode($data);

        } else {
            $data['response'] = false;
            echo json_encode($data);
        }

    }

}

?>

And this is My Model :

<?php
/**
 * 
 */
class Permohonan_model extends CI_Model {

    public function insertImageBarang($data = array()){

        $insert = $this->db->insert_batch('tb_image_barang', $data);
        return $insert?true:false;

    }

    public function insertNewRequestPesananBarang($pesananValue){

        $insert = $this->db->insert('tb_permohonan_pemesanan_barang', $pesananValue);
        return $insert?true:false;

    }

    public function insertNewCustomerData($customerValue){

        $insert = $this->db->insert('tb_customer', $customerValue);
        return $insert?true:false;

    }

    public function getCustomerData() {
        return $this->db->get('tb_customer')->result();
    }
}
?>

After run this app I got this error message :

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

But I think my JSON response is correct, this is my JSON response after tried in Postman :

{
    "response": true
}

You got the data from the server in jsosObject and you save it or parse it as a sting that was the main cause of this error. Please check the response.

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