Ожидаемый BEGIN_OBJECT, но STRING в строке 1, столбце 2, пути $

Я новичок в студии Android и stackoverflow. Я сейчас работаю над проектом, который входит в систему с модификацией, он связан с базой данных сервера sql. У меня появилось сообщение об ошибке, когда я запускаю приложение и вхожу в систему, и оно показало java.lang.illegalStateException: Expected BEGIN_OJECT, но было STRING в строке 1 столбца 2 пути $

код вебапи:

public class userController : ApiController
    {
        [HttpGet]
        public string getUser()
        {
            SqlConnection mainconn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString);
            SqlDataAdapter da = new SqlDataAdapter("Select UserID, username, password from tblLogin", mainconn);
            DataTable dt = new DataTable();
            da.Fill(dt);
            if (dt.Rows.Count > 0 )
            {
                return JsonConvert.SerializeObject(dt);
            }
            else
            {
                return "User Not Found";
            }
        }

        [HttpGet]
        public string getUser(string username, string password)
        {
            SqlConnection mainconn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString);
            SqlDataAdapter da = new SqlDataAdapter("Select UserID, username, password from tblLogin where username = '" + username + "' and password = '" + password + "'", mainconn);
            DataTable dt = new DataTable();
            da.Fill(dt);
            if (dt.Rows.Count > 0)
            {
                return JsonConvert.SerializeObject(dt);
            }
            else
            {
                return "User Not Found";
            }
        }
    }

модель вебапи:

public class Person
    {
        public decimal UserID { get; set; }
        public string username { get; set; }
        public string password { get; set; }
    }

android ЛогинОтвет:

public class LoginResponse implements Serializable {

    private String UserID;
    private String username;
    private List<LoginRequest> loginRequests = null;

    public String getUserID() {
        return UserID;
    }

    public void setUserID(String userID) {
        UserID = userID;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public List<LoginRequest> getLoginRequests(){
        return loginRequests;
    }

    public void setLoginRequests(List<LoginRequest> loginRequests) {
        this.loginRequests = loginRequests;
    }
}

ЛогинЗапрос:

private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

АпиКлиент:

public class ApiClient {
    public static Retrofit getRetrofit() {

        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor).build();

        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl("http://XXX.XX.XXX.X/webapi/")
                .client(okHttpClient)
                .build();

        return retrofit;
    }

    public static UserService getService() {
        UserService userService = getRetrofit().create(UserService.class);

        return userService;
    }
}

пользовательский сервис:

public interface UserService {

    @GET("api/user/")
    Call<LoginResponse> loginUser(@Query("username") String username, @Query("password") String password);
}

ЛогинАктивность:

public class MainActivity extends AppCompatActivity {

    Button btnLogin;
    EditText edUsername, edPassword;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnLogin = findViewById(R.id.btnLogin);
        edUsername = findViewById(R.id.etUsername);
        edPassword = findViewById(R.id.etPassword);

        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (TextUtils.isEmpty(edUsername.getText().toString()) || TextUtils.isEmpty(edPassword.getText().toString())) {
                    String message = "All inputs required ..";
                    Toast.makeText(MainActivity.this,message,Toast.LENGTH_LONG).show();;
                } else {
                    LoginRequest loginRequest = new LoginRequest();
                    loginRequest.setUsername(edUsername.getText().toString());
                    loginRequest.setPassword(edPassword.getText().toString());
                    loginUser(loginRequest);
                }
            }
        });
    }

    public void loginUser(LoginRequest loginRequest) {
        Call<LoginResponse> loginResponseCall = ApiClient.getService().loginUser(edUsername.getText().toString(), edPassword.getText().toString());
        loginResponseCall.enqueue(new Callback<LoginResponse>() {
            @Override
            public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
                if (response.isSuccessful()) {
                    LoginResponse loginResponse = response.body();
                    startActivity(new Intent(MainActivity.this, Visitor.class).putExtra("data",loginResponse));
                    finish();
                } else {
                    String message = "An error occurred please try again later... ";
                    Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
                }
            }

            @Override
            public void onFailure(Call<LoginResponse> call, Throwable t) {
                String message = t.getLocalizedMessage();
                Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
            }
        });
    }
}

Результат вебапи:

<string xmlns = "http://schemas.microsoft.com/2003/10/Serialization/">[{"UserID":1.0,"username":"Steady","password":"test"}]</string>

Я не знаю, какая часть моего кода неверна, чтобы сделать эту ошибку, я хочу, чтобы он успешно вошел в систему на странице главного меню, знают ли какие-либо эксперты, как решить эту ошибку?

Проверьте ответы на stackoverflow.com/questions/41153634/…

Amanpreet Kaur 08.05.2023 06:55

@AmanpreetKaur, так что мне нужно сделать, это удалить заголовок Microsoft, чтобы он стал действительным JSON?

user21834984 08.05.2023 11:51

да, вы должны удалить заголовок

Amanpreet Kaur 08.05.2023 13:58

@AmanpreetKaur Я использовал IHttpActionResult для удаления заголовка, но он показывает другую ошибку Expected BEGIN_OBJECT But was BEGIN_ARRAY

user21834984 09.05.2023 08:58

не могли бы вы обновить вопрос и показать ответ, который вы не получаете.

Amanpreet Kaur 10.05.2023 08:49
0
5
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил проблему, если я изменил string на IHttpActionResult в моем webApi, поэтому результат показал [{"UserID":1.0,"username":"Steady","password":"test"}]

Обновленный веб-апи:

[HttpGet]
        public string getUser(string userName, string passWord)
        {
            List<Person> api = new List<Person>();
            SqlConnection mainconn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString);
            SqlCommand da = new SqlCommand("Select userID, username, password from tblLogin where username = '"+userName+"' and password = '"+passWord+"'", mainconn);
            mainconn.Open();
            while(dr.Read())
            {
                api.Add(new Person()
                {
                    UserID = Convert.ToDecimal(dr.GetValue(0)),
                    username = Convert.ToString(dr.GetValue(1)),
                    password = Convert.ToString(dr.GetValue(2))
                });
            }
        }

Другие вопросы по теме