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

改型: onFailure()......预期BEGIN_OBJECT但被String

傅安宁
2023-03-14

我正试图让onResponse()在我的回调中执行。出于某种原因,onFailure会不断被调用,即使服务器返回200个代码,我也会获取全部数据。

我不确定必须做什么才能正确执行onResponse,以便解析JSON并将对象添加到列表视图中。

相关片段:-

public class ActivePostFragment extends ListFragment  implements AdapterView.OnItemClickListener, OnClickListener{
    private ProgressBar progress;
    private Button btn_newPost;
    private RecyclerView recyclerView;
    private MyItemRecyclerViewAdapter mAdapter;
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_activepost,container,false);
        initViews(view);
        int uIdValue = getArguments().getInt("userID");
        Log.d(Constants.TAG, String.valueOf(uIdValue));
        progress.setVisibility(View.VISIBLE);
        loadPostsProcess(uIdValue);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        return view;
    }
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    }
    @Override
    public void onClick(View v){
        switch (v.getId()){
            case R.id.newPost:
                goToNewPost();
                break;
        }
    }
    private void initViews(View view){
        btn_newPost = (Button) view.findViewById(R.id.newPost);
        recyclerView = (android.support.v7.widget.RecyclerView) view.findViewById(R.id.recyclerView);
        btn_newPost.setOnClickListener(this);
        progress = (ProgressBar)view.findViewById(R.id.activePostProgress);
    }
    private void loadPostsProcess(int uIdValue) {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constants.BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
        RequestInterface requestInterface = retrofit.create(RequestInterface.class);
        User user = new User();
        ServerRequest request = new ServerRequest();
        request.setOperation(Constants.RETRIEVE_ALL_OPERATION);
        request.setUser(user);
        final Call<PostsServerResponse> response = requestInterface.postsByUser(uIdValue);
            response.enqueue(new Callback<PostsServerResponse>() {
                @Override
                public void onResponse(Call<PostsServerResponse> call, retrofit2.Response<PostsServerResponse> response) {
                    PostsServerResponse resp = response.body();
                    String jsonServerPosts = resp.getPosts();

                    Type listType = new TypeToken<ArrayList<Post>>(){}.getType();
                    final ArrayList<Post> jsonArrayList = new Gson().fromJson(jsonServerPosts, listType);
                    Log.d(Constants.TAG, jsonArrayList.toString());

                    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
                    recyclerView.setLayoutManager(mLayoutManager);
                    recyclerView.setItemAnimator(new DefaultItemAnimator());
                    recyclerView.setAdapter(new MyItemRecyclerViewAdapter(jsonArrayList, getActivity()));
                    progress.setVisibility(View.INVISIBLE);
                }
                @Override
                public void onFailure(Call<PostsServerResponse> call, Throwable t) {
                    Log.d(Constants.TAG, "Retrofit: onResponse not called, onFailure called instead... ");
                    Log.d(Constants.TAG, t.getStackTrace().toString());
                    Log.d(Constants.TAG, t.getMessage());
                    Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_INDEFINITE).show();
                    progress.setVisibility(View.INVISIBLE);
                }
            });
    }
    private void goToViewPost(){
    }
    private void goToNewPost(){
        Fragment newPost = new NewPostFragment();
        FragmentTransaction ft = getFragmentManager()
                .beginTransaction();
        ft.replace(R.id.fragment_frame, newPost);
        ft.commit();
    }
}

请求接口:-

公共接口请求接口{

@POST("index.php/")
Call<LoginServerResponse> operation(@Body ServerRequest request);

@GET("activePosts.php/")
Call<PostsServerResponse> postsByUser(@Query("uid") int userID);}

服务器响应类:

public class PostsServerResponse {
    private String result;
    private String message;
    private String posts;
    public String getResult() {
        return result;
    }
    public String getMessage() {
        return message;
    }
    public String getPosts() {
        return posts;
    }
}

php代码:-

require_once 'Functions.php';
$fun = new Functions();

if ($_SERVER['REQUEST_METHOD'] == 'GET'){
  $queryUserID = htmlspecialchars($_GET["uid"]);
  echo 'url query ID is: '.$queryUserID.'. ';
  echo $fun -> getPosts($queryUserID);

functions.php:

public function getPosts($queryUserID){
      $db = $this -> db;

  if ($db -> postsExist($queryUserID)){
    $result = $db -> getUserPosts($queryUserID);
    $response["result"] = "Success. ";
    $response["message"] = "Posts found. ";
    // might need to handle the formatting of the '$posts' object if there are multiple lines
    $response["posts"] = $result;
    return json_encode($response);
  }
  else{
    echo 'no active posts for this user ID. ';
  }
}

数据库操作:

public function getUserPosts($queryUserID){
    $sql = 'SELECT title, content FROM users JOIN post
                ON post.userID = users.sno WHERE sno = ?';
    $queryStmt = $this -> conn -> prepare($sql);
    if ($queryStmt -> bindParam(1, $queryUserID, PDO::PARAM_INT)) {
        echo '<br> userID: '.$queryUserID.' URL parameter bound successfully. </br>';
        if($queryStmt -> execute() ){
            echo '<br> query execution successful. there are rows. </br>';
            $resultSet = $queryStmt -> fetchAll(PDO::FETCH_ASSOC);

            return $resultSet;
        }
    }
}

这是我在服务器上的回复:

url query ID is: 3. <br> userID: 3 URL parameter bound successfully. </br><br> query execution successful. there are rows. </br>{"posts":[{"title":"test title 1","content":"hey this is the content for test title 1"},{"title":"test title 2","content":"hey this is the content for the second post!"}]}

这是堆栈跟踪和异常:

[Ljava.lang.StackTraceeElement;@efa7528 java.lang.IllegalStateException:应为BEGIN_对象,但在第1行第1列路径处为字符串$

如果我没有包括所有相关信息,请告诉我

共有1个答案

谢飞舟
2023-03-14

改造需要一个对象,但它接收到一个字符串。

替换echo“url查询ID为:”$queryUserID“;echo$fun-

具有

echo getPosts($queryUserID)

 类似资料:
  • 我已经读了很多关于这个错误的答案,但我没有找到解决方案,也许类对象不一样 我的错误是: 通用域名格式。谷歌。格森。JsonSyntaxException:java。lang.IllegalStateException:应为字符串,但为BEGIN_对象 所以,我只是想从JSON中获取一个对象,如下所示: 我的JsonObject是: 我的不同POJO(我不把get和set简称为代码): 这是完整的堆

  • 我正在通过改型和RXAndroid与来自android的REST API进行交互,我遇到了一个问题。 当我向我的“api/users/{id}/{id}/classes”发送GET请求时,我的api会以用户类列表作出响应,如下所示: 我的界面如下所示: 我从片段中这样称呼它: 我的类对象以及getter和setter如下所示: gson不应该看到“类”:[]数组并从中解析对象吗?我做错了什么

  • 我每次都会收到这个错误:预期的begin_数组,但它是begin_对象。我不知道我是否需要添加反序列化程序或warrper类来进行改造,但我不知道如何以简单的方式来满足我所有项目的api json响应,下面是我的改造代码: - 我的Json: 我的源代码

  • 我做了一个功能:输入身份证号码,点击提交按钮,然后获得身份证的基本信息。 我使用的模型是: 我使用的改装界面: 当我输入正确的身份证号码时,一切正常。返回的结果是: 一切运作良好。 然而,当我输入不正确的身份证号码时,不好的事情发生了: 返回的结果是: 我怎样才能修复这些漏洞?

  • 我不熟悉GSON和改装,这是我的输出模型(仅供参考结构), 这是我的输出 这是我的改装代码 应为BEGIN_对象,但为BEGIN_数组“ 我尝试过用List替换RootObject

  • 问题内容: 我在尝试将JSON解组到对象中时遇到GSON错误。错误( 应为BEGIN_OBJECT,但在第3行第22列处为STRING )指向下面输入的第3行。 我是否相对于Bean正确映射了JSON? 我输入的JSON看起来是这样的: 问题答案: 不,您没有正确映射它,因为您的json对象不是,它包含。 你可以创建一个类只是为了封装你,但它是清洁反序列化容器的使用 然后使用解析有趣的内容 并且我