首页 > 解决方案 > 改造预期 BEGIN_OBJECT 但在 POST 方法中是 BEGIN_ARRAY

问题描述

我正在编写改造 get 和 post 方法来与http://www.json-generator.com/api/json/get/bUAQsEtVCG?indent=2上的 json 文件进行通信。我对 get 方法没有任何问题,因为它运行良好,但我在使用 post 方法时遇到了问题。它向我显示此错误:预期 BEGIN_OBJECT 但在第 1 行第 2 列路径 $ 处为 BEGIN_ARRAY。

API.Java

package com.example.yee_c.retrofit;

import java.util.List;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;

public interface API {

    String BASE_URL = "http://www.json-generator.com/api/json/";

    @GET("get/bUAQsEtVCG?indent=2")
    Call<List<User>> getUsers();

    @POST("get/bUAQsEtVCG?indent=2")
    Call<User> postUsers(@Body User user);
}

用户Java

package com.example.yee_c.retrofit;

import com.google.gson.annotations.SerializedName;

public class User {
    @SerializedName("id")
    private int id;

    @SerializedName("username")
    private String username;

    @SerializedName("password")
    private String password;

    @SerializedName("name")
    private String name;

    @SerializedName("balance")
    private double balance;

    @SerializedName("accountNumber")
    private String accountNumber;

    @SerializedName("mobileNumber")
    private String mobileNumber;

    @SerializedName("email")
    private String email;


    public User(int id, String username, String password, String name, double balance, String accountNumber, String mobileNumber, String email)
    {
        this.id = id;
        this.username = username;
        this.password = password;
        this.name = name;
        this.balance = balance;
        this.accountNumber = accountNumber;
        this.mobileNumber = mobileNumber;
        this.email = email;
    }
    public int getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public String getName() {
        return name;
    }

    public double getBalance() {
        return balance;
    }

    public String getAccountNumber() {
        return accountNumber;
    }

    public String getMobileNumber() {
        return mobileNumber;
    }

    public String getEmail() {
        return email;
    }
}

改造客户端.Java

package com.example.yee_c.retrofit;

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

public class RetrofitClient {
    private static RetrofitClient mInstance;
    private Retrofit retrofit;

    private RetrofitClient() {
        retrofit = new Retrofit.Builder()
                .baseUrl(API.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create()) //Here we are using the GsonConverterFactory to directly convert json data to object
                .build();
    }
    public static synchronized RetrofitClient getmInstance(){
        if (mInstance == null) {
            mInstance = new RetrofitClient();
        }
        return mInstance;
    }

    public API getApi(){
        return retrofit.create(API.class);
    }
}

MainActivity.Java

package com.example.yee_c.retrofit;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

import static java.lang.Double.parseDouble;

public class MainActivity extends AppCompatActivity {
    String TAG = "MainActivity.java";

    EditText usernameET,nameET,pwET,balET,accET,phoneET,emailET;
    Button btnSubmit;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        usernameET = findViewById(R.id.editUserName);
        nameET = findViewById(R.id.editName);
        pwET = findViewById(R.id.editPassword);
        balET = findViewById(R.id.editBal);
        accET = findViewById(R.id.editAccount);
        phoneET = findViewById(R.id.editMobile);
        emailET = findViewById(R.id.editEmail);
        btnSubmit = findViewById(R.id.submitBtn);

        //calling the method to display the heroes
        getUsers();

        btnSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                User user= new User(
                        '5',
                        usernameET.getText().toString(),
                        nameET.getText().toString(),
                        pwET.getText().toString(),
                        parseDouble(balET.getText().toString()),
                        accET.getText().toString(),
                        phoneET.getText().toString(),
                        emailET.getText().toString());
                postUsers(user);
            }
        });

    }

    private void getUsers() {
        Call<List<User>> call = RetrofitClient.getmInstance().getApi().getUsers();

        call.enqueue(new Callback<List<User>>() {
            @Override
            public void onResponse(Call<List<User>> call, Response<List<User>> response) {

                Log.d(TAG,"Successfully response");

                List<User> userList = response.body();

                //Creating an String array for the ListView

                //looping through the users and displaying user info where ID = 1
                for (int i = 0; i < userList.size(); i++) {
                    if(userList.get(i).getId() == 2) {
                        usernameET.setText(userList.get(i).getUsername());
                        pwET.setText(userList.get(i).getPassword());
                        nameET.setText(userList.get(i).getName());
                        String bal = Double.toString(userList.get(i).getBalance());
                        balET.setText(bal);
                        accET.setText(userList.get(i).getAccountNumber());
                        phoneET.setText(userList.get(i).getMobileNumber());
                        emailET.setText(userList.get(i).getEmail());
                    }
                }
            }

            @Override
            public void onFailure(Call<List<User>> call, Throwable t) {
                Log.d(TAG,t.getMessage());
            }
        });
    }


    private void postUsers(User user) {

        Call<User> userCall = RetrofitClient.getmInstance().getApi().postUsers(user);

        userCall.enqueue(new Callback<User>() {
            @Override
            public void onResponse(Call<User> call, Response<User> response) {
                int statusCode = response.code();
                Toast.makeText(getApplicationContext(),"Response Code " + statusCode,Toast.LENGTH_LONG).show();
            }

            @Override
            public void onFailure(Call<User> call, Throwable t) {
                Log.d(TAG,"onFailure" + t.getMessage());
            }
        });

    }
}

非常感谢您的帮助。谢谢。

标签: androidretrofit2

解决方案


推荐阅读