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

使用Gson解析json用于登录系统-应用程序强制关闭

梅耘豪
2023-03-14

我试图为我的项目创建一个登录系统。我想创建这样的过程:填完表单后单击register按钮,将带有URL的数据发送到API,并返回以下json字符串

{
  "result": "OK",
  "message": [
      "Congratulations! You will shortly receive email ."
  ],
  "values": {
      "id": 178964,
      "fname": "", 
      "gender": "female"
  }
}

结果字符串只返回OK或No。现在我想在结果返回'OK'时在loginErrorMsg中显示'Message'。如果结果返回Ok,则应该启动LoginActivity。但是我在解析JSON/GSON时丢失了一些东西。

    public class RegisterActivity  extends Activity{
        private static String URL = "http://api.eample.com/";
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.register);

            final EditText inputFname = (EditText) findViewById(R.id.registerFname);
            final EditText inputLname = (EditText) findViewById(R.id.registerLname);
            final EditText inputEmail = (EditText) findViewById(R.id.registerEmail);
            Button btnRegister = (Button) findViewById(R.id.btnRegister);
            Button btnLinkToLogin = (Button) findViewById(R.id.btnLinkToLogin);
            final TextView loginErrorMsg = (TextView) findViewById(R.id.register_error);

            // Register Button Click event
            btnRegister.setOnClickListener(new View.OnClickListener() {  
                Login login2;
                RadioGroup radioSexGroup = (RadioGroup) findViewById(R.id.sex);
                public void onClick(View view) {
                    String fname = inputFname.getText().toString();
                    String lname = inputLname.getText().toString();
                    String email = inputEmail.getText().toString();

                    // get selected radio button from radioGroup
                    int selectedId = radioSexGroup.getCheckedRadioButtonId();
                    RadioButton radioSexButton = (RadioButton) findViewById(selectedId);
                    String gender = radioSexButton.getText().toString();
                    System.out.println(fname);
                    //Toast.makeText(RegisterActivity.this, radioSexButton.getText(), Toast.LENGTH_SHORT).show();

                    String registerURL = URL +"&user_email="+ email +"&first_name="+ fname +"&last_name="+ lname +"&gender="+ gender;
                    System.out.println(registerURL);

                    if( email.length() == 0) {
                        loginErrorMsg.setText(R.string.empty);
                        //Toast.makeText(view.getContext(), R.string.empty, Toast.LENGTH_SHORT).show();
                        return;
                    }else{

                        try {
                            //Create an HTTP client
                            HttpClient client = new DefaultHttpClient();
                            HttpPost post = new HttpPost(registerURL);

                            //Perform the request and check the status code
                            HttpResponse response = client.execute(post);
                            StatusLine statusLine = response.getStatusLine();
                            if(statusLine.getStatusCode() == 200) {
                                HttpEntity entity = response.getEntity();
                                InputStream content = entity.getContent();

                                try {
                                    //Read the server response and attempt to parse it as JSON
                                    Reader reader = new InputStreamReader(content);

                                    Gson gson = new Gson();
                                    this.login2 = gson.fromJson(reader, Login.class);

                                    //handlePostsList(posts);
                                } catch (Exception ex) {
                                    //Log.e(TAG, "Failed to parse JSON due to: " + ex);
                                    failedLoading();
                                }
                            } else {
                                //Log.e(TAG, "Server responded with status code: " + statusLine.getStatusCode());
                                failedLoading();
                            }
                        } catch(Exception ex) {
                            //Log.e(TAG, "Failed to send HTTP POST request due to: " + ex);
                            failedLoading();
                        }
//To set register message
                    if(login2.getResult().equals("OK")){
                        loginErrorMsg.setText(login2.getMessage().toString());
                    }
                    }


                }
            });

        }
09-29 13:05:13.145: E/AndroidRuntime(9428): FATAL EXCEPTION: main
09-29 13:05:13.145: E/AndroidRuntime(9428): java.lang.NullPointerException
09-29 13:05:13.145: E/AndroidRuntime(9428):     at com.kabelash.sk.RegisterActivity$1.onClick(RegisterActivity.java:105)
09-29 13:05:13.145: E/AndroidRuntime(9428):     at android.view.View.performClick(View.java:4211)
09-29 13:05:13.145: E/AndroidRuntime(9428):     at android.view.View$PerformClick.run(View.java:17267)
09-29 13:05:13.145: E/AndroidRuntime(9428):     at android.os.Handler.handleCallback(Handler.java:615)
09-29 13:05:13.145: E/AndroidRuntime(9428):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-29 13:05:13.145: E/AndroidRuntime(9428):     at android.os.Looper.loop(Looper.java:137)
09-29 13:05:13.145: E/AndroidRuntime(9428):     at android.app.ActivityThread.main(ActivityThread.java:4898)
09-29 13:05:13.145: E/AndroidRuntime(9428):     at java.lang.reflect.Method.invokeNative(Native Method)
09-29 13:05:13.145: E/AndroidRuntime(9428):     at java.lang.reflect.Method.invoke(Method.java:511)
09-29 13:05:13.145: E/AndroidRuntime(9428):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
09-29 13:05:13.145: E/AndroidRuntime(9428):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
09-29 13:05:13.145: E/AndroidRuntime(9428):     at dalvik.system.NativeStart.main(Native Method)
09-29 13:10:21.380: I/Process(9428): Sending signal. PID: 9428 SIG: 9

共有1个答案

咸亦
2023-03-14

您的Java类login不代表JSON响应的结构!

首先,JSON中的字段message是一个数组(“message”:[...]),而不是像类login那样的字符串

此外,JSON中的字段values是一个对象(values:{...}),而不是像类login那样的ArrayList

String result;
List<String> message;
Values values;

您还需要创建一个具有以下属性的类values:

long id;
String fname;
String gender;
 类似资料:
  • 我正在使用凌空OkHttp从服务器获取一些数据。 响应是一个包含JSON的字符串,我想使用GSON/POJO解析它。 我得到错误: 预期BEGIN_OBJECT,但在第1行第1列路径$上是STRING 尝试解析时。 原因:java.lang.IllegalStateException:预期BEGIN_OBJECT但在第1行第1列路径$ com.google.gson.stream.JsonRead

  • 问题内容: 我想使用 GSON* 在 JAVA中 解析此 JSON 文件: *** 但是我不知道如何加入root元素: 描述符 ,之后是 app3 元素,最后是 name 元素。 我遵循了本教程http://www.mkyong.com/java/gson-streaming-to-read-and-write- json/ ,但是它没有显示具有root和childs元素的情况。 问题答案: Im

  • 问题内容: 我有一个像这样的JSON文件: 在文件具有根元素之前,我将使用: 代码,但我不认为如何将类编码为根元素是一个数组。 我试过使用: 与: 但是还没有运气。使用这种方法我还能怎么读呢? PS我有这个工作使用: 但是我更想知道如何使用这两种方法(如果可能)。 问题答案: 问题是由放置在数组中的JSON对象(在 每种 情况下)的末尾逗号引起的: 如果删除它们,您的数据将成为 和 应该工作正常。

  • 附言:我用这个来工作: 但我更希望知道如何做到这一点(如果可能的话)与这两种方法。

  • 我学习了这个教程http://www.mkyong.com/java/gson-streaming-to-read-and-write-json/,但它没有显示root和childs元素的情况。