okhttp+fastjson 报错 cannot resolve method ‘parseObject’

BUG描述:

明明引入了import com.alibaba.fastjson.JSON;但as显示该引用未被使用。

JSONObject jsonObject= JSON.parseObject(data);的时候,as将parseObject标红,表示无法识别进行处理。

 

BUG出现原因:

由于在该活动内涉及okhttp进行网络通信,其中已经对JSON进行了定义,这与fastjson的JSON冲突,当涉及JSON的时候系统自动使用该定义导致无法引入fastjson的JSON包。

//okhttp已经定义了一个JSON对象
public static final MediaType JSON= MediaType.get("application/json; charset=utf-8");
。。。省略中间其他okhttp的内容
formBody = RequestBody.create(post,JSON);

解决办法:

//将okhttp用到的JSON改名为其他内容,解决冲突
public static final MediaType JSON1= MediaType.get("application/json; charset=utf-8");
。。。省略中间其他okhttp的内容

formBody = RequestBody.create(post,JSON1);

最后,放上我的MainActivity的代码,供初学okhttp+fastjson的同学们参考。由于我也是第一次使用,可能有的地方写的不够好,如有不足请指正。

package com.example.testhrms;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;

import org.jetbrains.annotations.NotNull;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.util.concurrent.TimeUnit;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;


public class LoginActivity extends AppCompatActivity {
    public static final MediaType JSON1= MediaType.get("application/json; charset=utf-8");
    EditText et_userid;
    EditText et_userpwd;
    String username;
    String password;
    private JSONObject jsonfile;
    private String data;//接收服务器返回的数据

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        //初始化资源控件
        initView();

    }
    //获取资源控件id
    private void initView() {
        et_userid=findViewById(R.id.et_userid);
        et_userpwd=findViewById(R.id.et_userpwd);
    }

    //点击登陆按钮后执行
    public void doLogin(View view) throws UnsupportedEncodingException {
        //首先获取用户输入的账号和密码
        username = et_userid.getText().toString().trim();
        password = et_userpwd.getText().toString().trim();
        Log.i("net_test", username+"/"+password);
        //判断用户输入的账号与密码是否为空
        if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){
            Toast.makeText(this, "输入不能为空", Toast.LENGTH_SHORT).show();
            return;
    }
        //
        else//两个输入都非空,准备执行okhttp
        {
            try {
                post_login(username,password);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }


    }
    private  void post_login(String username,String password) throws JSONException {
        //拼接要发送的json
        jsonfile=new JSONObject();
        jsonfile.put("user_id",username);
        jsonfile.put("user_key",password);
        String post=jsonfile.toString();
        //1,创建OKHttpClient对象
        OkHttpClient okHttpClient=new OkHttpClient();
        okHttpClient.newBuilder().connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(15, TimeUnit.SECONDS)
                .writeTimeout(150, TimeUnit.MILLISECONDS)
                .build();
        RequestBody formBody;
        formBody = RequestBody.create(post,JSON1);

        //拼接url字符串
        String s1=getString(R.string.server_url0);
        String s2="post_login.php";//post_login.php
        //String s3=getString(R.string.server_lasturl);//?Content-Type=application/json
        String url=s1+s2;
        Log.i("net_test", url);

        //2,创建一个Request
        Request request=new Request.Builder()
                .addHeader("Content-Type","application/json")
                .url(url)
                .post(formBody)
                .build();
        Log.i("net_test","request创建成功");
        //3,创建一个call对象
        Call call = okHttpClient.newCall(request);
        //4,将请求添加到调度中
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                Log.d("net_test", "onFailure: failure");	//用来看是否失败
                Log.d("net_test", e.toString());

                if(e instanceof SocketTimeoutException)
                {
                    Log.d("net_test", "超时异常");
                }
                else if(e instanceof ConnectException)
                {
                    Log.d("net_test", "连接异常");
                }
            }
            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                Log.d("net_test", "onResponse:response ");		//用来看是否有响应
                //利用fastjson处理json数据并准备保存到全局变量中
                data=response.body().string();
                Log.d("net_test", "成功返回结果:"+data);
                //成功返回结果:{"user_id":"15588399220","department_id":"1","user_name":"柳一菲","user_rank":"1"}
                //JSONObject jsonObject=JSON.parseObject(data);

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        //mytext.setText(data);
                            if(data.equals("false1"))
                            {
                                Log.i("net_test", "密码错误");
                                new Handler(Looper.getMainLooper()).post(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(LoginActivity.this, "密码错误!", Toast.LENGTH_SHORT).show();
                                    }
                                });

                            }
                            else if(data.equals("false2"))
                            {
                                Log.i("net_test", "账号不存在");
                                new Handler(Looper.getMainLooper()).post(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(LoginActivity.this, "账号不存在,请先联系管理员注册!", Toast.LENGTH_SHORT).show();
                                    }
                                });

                            }
                            else
                            {
                                Log.i("net_test", "登陆成功");
                                JSONObject jsonObject= JSON.parseObject(data);

                                final String user_id=jsonObject.getString("user_id");
                                final String user_name=jsonObject.getString("user_name");
                                final String department_id=jsonObject.getString("department_id");
                                final String user_rank=jsonObject.getString("user_rank");
                                Log.i("net_test","json对象:" + user_id+"/"+user_name+"/"+department_id+"/"+user_rank);
                                //处理传回的用户信息数据
                                myData.set_user_id(user_id);
                                myData.set_department_id(department_id);
                                myData.set_user_name(user_name);
                                myData.set_user_rank(user_rank);
                                Log.i("net_test","将账户信息相关的json存为全局变量成功!:"
                                        + myData.get_user_id()+"/"+myData.get_department_id()+"/"+myData.get_user_name()+"/"+myData.get_user_rank());
                                 //如果需要存储的全局变量都被赋值成功则跳转主页面
                                if(!myData.get_user_id().equals("")&&!myData.get_user_name().equals("")
                                        &&!myData.get_user_rank().equals("")&&!myData.get_department_id().equals(""))
                                {
                                    //Toast必须出现在主线程上。使用 new Handler(Looper.getMainLooper()) 来生成一个主线程
                                    // handler 从任何后台回线程,然后使用它发布 toast 主线程的工作
                                    new Handler(Looper.getMainLooper()).post(new Runnable() {
                                        @Override
                                        public void run() {
                                            Toast.makeText(LoginActivity.this, "登陆成功!", Toast.LENGTH_SHORT).show();

                                            //跳转到主页面
                                            Intent intent = new Intent(LoginActivity.this,
                                                    MainActivity.class);
                                            startActivity(intent);
                                            LoginActivity.this.finish();
                                        }
                                    });
                                }
                                


                            }

                    }
                });


            }


        });


    }



    //okhttp官网的post案例
//    public static final MediaType JSON
//            = MediaType.get("application/json; charset=utf-8");
//
//    OkHttpClient client = new OkHttpClient();
//
//    String post(String url, String json) throws IOException {
//        RequestBody body = RequestBody.create(json, JSON);
//        Request request = new Request.Builder()
//                .url(url)
//                .post(body)
//                .build();
//        try (Response response = client.newCall(request).execute()) {
//            return response.body().string();
//        }
//    }

    //okhttp官网的get案例
//    OkHttpClient client = new OkHttpClient();
//
//    String run(String url) throws IOException {
//        Request request = new Request.Builder()
//                .url(url)
//                .build();
//
//        try (Response response = client.newCall(request).execute()) {
//            return response.body().string();
//        }
//    }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章