当前位置: 首页 > 知识库问答 >
问题:

java.lang.IllegalStateException: expected BEGIN_OBJECT 但 was STRING

范浩宕
2023-03-14

我编写了一个登录功能并与web服务进行通信我正在使用改装,但总是“失败”

获取:

retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

LoginAPI.java

public interface LoginApi {
    @FormUrlEncoded
    @POST("/retrofit_user/login.php")
    public void getlogin(
        @Field("username") String username,
        @Field("password") String password,
        Callback<User> response);
}

登录活动.java:

restAdapter = new RestAdapter.Builder().setEndpoint(ROOT_LOGIN).build();
restAdapter.setLogLevel(RestAdapter.LogLevel.FULL);
loginApi = restAdapter.create(LoginApi.class);

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

  loginApi.getlogin(editTextUsername.getText().toString(),
  editTextPassword.getText().toString(), new Callback<User>() {

  @Override
  public void success(User s, Response response) {
     Toast.makeText(LoginActivity.this,"Logged In",Toast.LENGTH_LONG).show();

    if(s != null) {
       Log.d("name:", s.getName());
       Log.d("email:", s.getEmail());
       Log.d("id:", String.valueOf(s.getId()));
    }

  }

  @Override
  public void failure(RetrofitError error) {

       Log.d("error:", error.toString());
 Toast.makeText(LoginActivity.this,"Failed",Toast.LENGTH_LONG).show();
          }
      });
    }
});

User.java:

public class User {

    String name;
    String username;
    String password;
    String email;
    int id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    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 String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

日志说

D/Retrofit: <--- HTTP 200 http://domain.info/retrofit_user/login.php (942ms)
D/Retrofit: : HTTP/1.1 200 OK
D/Retrofit: Connection: Keep-Alive
D/Retrofit: Content-Type: text/html; charset=UTF-8
D/Retrofit: Date: Sat, 20 Feb 2016 06:00:39 GMT
D/Retrofit: Keep-Alive: timeout=5, max=100
D/Retrofit: Server: Apache/2.4.16 (Unix) OpenSSL/1.0.1e-fips mod_bwlimited/1.4
D/Retrofit: Transfer-Encoding: chunked
D/Retrofit: X-Android-Received-Millis: 1455948038590
D/Retrofit: X-Android-Response-Source: NETWORK 200
D/Retrofit: X-Android-Selected-Transport: http/1.1
D/Retrofit: X-Android-Sent-Millis: 1455948037988
D/Retrofit: X-Powered-By: PHP/5.6.14
D/Retrofit: Done
D/Retrofit: <--- END HTTP (4-byte body)
D/error:: retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
D/GraphicBuffer: create handle(0x55bb2e98) (w:256, h:66, f:1)
D/GraphicBuffer: close handle(0x55bb2e98) (w:256 h:66 f:1)

下面是我的< code>login.php脚本:

<?php

    $objConnect = mysql_connect("localhost","username","password");
    $objDB = mysql_select_db("database");

    /*** for sample */
    // $_POST["username"] = "sun";
    // $_POST["password"] = "live";

    $username = $_REQUEST['username'];
    $password = $_REQUEST['password'];

    $strSQL = "select * from test_users where username = '".$username."' and  password = '".$password."' ";

    $objQuery = mysql_query($strSQL);
    $intNumRows = mysql_num_rows($objQuery);

    if($intNumRows==0)
    {
    echo "Not Done" ;
    }
    else
    {
    echo "Done" ;
    }

    mysql_close($objConnect);
?>

共有1个答案

濮宇定
2023-03-14

问题是,改造需要一个JSON输出,它可以从login.php适合User类,但.php给出的所有logon.php都是“未完成”或“完成”。

您必须以以下格式制作php脚本输出json,

{
    "name": "name",
    "username": "username",
    "password": "password",
    "email": "email",
    "id": id
}

你必须编辑php代码。大概是这样的,

<?php
    $objConnect = mysql_connect("localhost","username","password");
    $objDB = mysql_select_db("database");

    /*** for sample */
    // $_POST["username"] = "sun";
    // $_POST["password"] = "live";

    $username = $_REQUEST['username'];
    $password = $_REQUEST['password'];

    $strSQL = "select * from test_users where username = '".$username."' and  password = '".$password."' ";

    $objQuery = mysql_query($strSQL);
    $intNumRows = mysql_num_rows($objQuery);
    if($intNumRows==0)
    {
        $response["success"] = 0;
        $response["name"] = "";
        $response["username"] = "";
        $response["password"] = "";
        $response["email"] = "";
        $response["id"] = 0;
    }
    else
    {
        $row = mysql_fetch_array($objQuery);
        $response["success"] = 1;
        $response["name"] = $row["name"];
        $response["username"] = $row["username"];
        $response["password"] = $row["password"];
        $response["email"] = $row["email"];
        $response["id"] = $row["id"];
    }

    mysql_close($objConnect);

    echo json_encode($response, JSON_NUMERIC_CHECK);
?>

还添加了一个<code>int success 字段”添加到用户类,并使用它验证输出。所以你的成功方法是,

@Override
public void success(User s, Response response) {
    if(s != null && s.getSuccess() == 1) {
        Toast.makeText(LoginActivity.this,"Logged In",Toast.LENGTH_LONG).show();
        Log.d("name:", s.getName());
        Log.d("email:", s.getEmail());
        Log.d("id:", String.valueOf(s.getId()));
    } else {
        Toast.makeText(LoginActivity.this,"Invalid!",Toast.LENGTH_LONG).show();
    }

}

更新

< code>id字段是数据库中的< code>int,它以字符串形式返回id。看到这个线程。在php中将< code>JSON_NUMERIC_CHECK添加到< code>json_encode()中会有所帮助。

 类似资料:
  • 我对GSON非常陌生, 几天前有人建议使用GSON,我在这里寻求一些帮助 我正在尝试分析此响应,但收到了所述错误。。 我只是得到了“状态”部分,但得到了错误。 对我的模特来说。

  • 我正在尝试从XML文件中提取数据。将XML转换为JSON后,我无法访问数据。我正在用GSON解析数据。 这段代码给了我一个错误。 有什么建议吗?提前谢谢。 这是JSON内容: 这是以下类:

  • expr:计算表达式或正则匹配 m4:简单的宏处理器 yes:多次打印字符串 cal:漂亮的日历 env:执行一个命令(脚本文件中很有用) printenv:打印环境变量(调试时或在写脚本文件时很有用) look:查找以特定字符串开头的单词或行 cut,paste 和 join:数据修改 fmt:格式化文本段落 pr:将文本格式化成页/列形式 fold:包裹文本中的几行 column:将文本格式化

  • 我正在学习改装2,遇到如下错误: 带系统。错误:com。谷歌。格森。JsonSyntaxException:java。lang.IllegalStateException:应为BEGIN\u对象,但在第1行第94列路径$处为BEGIN\u数组。com的riceField。谷歌。格森。内部的绑定ReflectiveTypeAdapterFactory$适配器。阅读(ReflectiveTypeAda

  • 我已经搜索了其他相关的问题,但找不到我的答案。 这是我的JSON:named

  • 我正在为我的spring项目构建一个本机查询。有人知道这是什么问题吗? org.hibernate.hql.internal.ast.QuerySyntaxException:需要IDENT,在第1行第348列附近找到“:”[选择e.first_name作为第一名,e.last_na me作为最后一名,jh.start_date作为开始日期,jh.end_date作为结束日期,j.job_titl

  • 问题内容: H2 1.4.191。 DbUnit 2.5.1。 如何解决? 3种情况的代码和结果: 问题答案: 有时,当您使用dbunit时,您需要定义尝试使用该表的模式,也许您可​​以尝试添加 如果不检查您正在使用的数据源,则可能您未指向正确的数据库或架构。 对于dbunit,我们具有一些属性,请考虑按以下方式使用该属性。