2016-01-22 33 views
0

我想用json创建一个登录和注册系统。 我想先获取url的内容,然后解析json字符串。 Json String sample:在android中解析简单的json字符串

{ "employee":{"mesg":"username is exsist!","id":0,"name":0,"username":0,"email":0,"status":500} } 

我只需要mesg或状态。 我无法解析它。我想解析这个字符串,每次,我的应用程序给力停止

这是我的代码:

package com.sourcey.materiallogindemo; 

import android.app.ProgressDialog; 

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 

import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 



import butterknife.Bind; 
import butterknife.ButterKnife; 

public class SignupActivity extends AppCompatActivity { 

    //URL to get JSON Array 

    //JSON Node Names 



    public String nurl; 


    private static final String TAG = "SignupActivity"; 

    @Bind(R.id.input_name) EditText _nameText; 
    @Bind(R.id.input_email) EditText _emailText; 
    @Bind(R.id.input_tell) EditText _tellText; 
    @Bind(R.id.input_password) EditText _passwordText; 
    @Bind(R.id.btn_signup) Button _signupButton; 
    @Bind(R.id.link_login) TextView _loginLink; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_signup); 
     ButterKnife.bind(this); 

     _signupButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       signup(); 
      } 
     }); 

     _loginLink.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Finish the registration screen and return to the Login activity 
       finish(); 
      } 
     }); 
    } 



    public void signup() { 
     Log.d(TAG, "Signup"); 

     if (!validate()) { 
      onSignupFailed(); 
      return; 
     } 

     _signupButton.setEnabled(false); 

     final ProgressDialog progressDialog = new ProgressDialog(SignupActivity.this, 
       R.style.AppTheme_Dark_Dialog); 
     progressDialog.setIndeterminate(true); 
     progressDialog.setMessage("در حال انجام عملیات..."); 
     progressDialog.show(); 

     String name = _nameText.getText().toString(); 
     String email = _emailText.getText().toString(); 
     String tell = _tellText.getText().toString(); 
     String password = _passwordText.getText().toString(); 

     // TODO: Implement your own signup logic here. 

     nurl = "http://someurl/json/user.php?type=register&mobile="+tell+"&p="+password+"&email="+email+"&name="+name; 

     //new JSONParse().execute(); 

     new android.os.Handler().postDelayed(
       new Runnable() { 
        public void run() { 

         onSignupSuccess(); 
         progressDialog.dismiss(); 


        } 
       }, 3000); 
    } 


    public void onSignupSuccess() { 
     _signupButton.setEnabled(true); 
     setResult(RESULT_OK, null); 
     finish(); 
    } 

    public void onSignupFailed() { 
     Toast.makeText(getBaseContext(), "Login failed", Toast.LENGTH_LONG).show(); 

     _signupButton.setEnabled(true); 
    } 

    public boolean validate() { 
     boolean valid = true; 

     String name = _nameText.getText().toString(); 
     String email = _emailText.getText().toString(); 
     String tell = _tellText.getText().toString(); 
     String password = _passwordText.getText().toString(); 

     if (name.isEmpty() || name.length() < 3) { 
      _nameText.setError("at least 3 characters"); 
      valid = false; 
     } else { 
      _nameText.setError(null); 
     } 

     if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) { 
      _emailText.setError("enter a valid email address"); 
      valid = false; 
     } else { 
      _emailText.setError(null); 
     } 

     if (tell.isEmpty() || !android.util.Patterns.PHONE.matcher(tell).matches()) { 
      _tellText.setError("enter a valid phone number"); 
      valid = false; 
     } else { 
      _tellText.setError(null); 
     } 

     if (password.isEmpty() || password.length() < 4 || password.length() > 10) { 
      _passwordText.setError("between 4 and 10 alphanumeric characters"); 
      valid = false; 
     } else { 
      _passwordText.setError(null); 
     } 



     return valid; 
    } 













} 

现在我不知道我能做些什么确切地解析字符串,得到的只是状态或MESG,谢谢掌舵。我非常需要这个,对于一个成熟的问题感到抱歉。 关于

+0

其中U试图解析发布JSON字符串 –

+0

你有一些很好的答案显示代码示例代码。我建议你使用这里的答案之一,而不是创建一个新的问题。 – Knossos

回答

1

您可以使用JSONObject执行此任务。

例如(省略的try/catch):

JSONObject root = new JSONObject(jsonString); 
JSONObject employee = root.getJSONObject("employee"); 
String message = employee.getString("name"); 
String username = employee.getString("username"); 
String email = employee.getString("email"); 
int id = employee.getInt("id"); 
int status = employee.getInt("status"); 

如果你不知道你的JSON的一致性,你应该先check whether the key exists

您还应该检查您的JSON数据类型,您似乎有名称,用户名和电子邮件的整数。但是,那些很少是整数。

JSONObject Documentation

1

使用排库正从如下网址JSON响应 -

首先在你的项目模块添加库:应用程序依赖如下 -

dependencies { 
compile 'com.mcxiaoke.volley:library-aar:1.0.1' 
... 
} 

下面的代码使用摆脱排球图书馆响应 -

// Instantiate the RequestQueue. 
    RequestQueue queue = Volley.newRequestQueue(this); 
    String url = "WEBSERVICE_URL"; // eg:- "http://www.google.com"; 

    // Request a string response from the provided URL. 
    StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { 

       @Override 
       public void onResponse(String response) { 
        System.out.println("Response is: " + response); 
        try { 
         JSONObject jobj = new JSONObject(response); 
         JSONObject jEmp = jobj.getJSONObject("employee"); 
         String message = jEmp.getString("mesg"); 
         int Status = jEmp.getInt("status"); 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 

       } 
      }, new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 

        if(error.networkResponse != null && error.networkResponse.data != null){ 
         VolleyError verror = new VolleyError(new String(error.networkResponse.data)); 
         System.out.println("That didn't work!\n" + error.toString()); 
        } 

       } 

    }); 

    // Add the request to the RequestQueue. 
    queue.add(stringRequest); 

您可以分析如下的JSON -

try { 
     JSONObject jobj = new JSONObject(responseJSONString); 
     JSONObject jEmp = jobj.getJSONObject("employee"); 
     String message = jEmp.getString("mesg"); 
     int Status = jEmp.getInt("status"); 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

`responseJSONString` is the JSON response you got. 
+0

它工作的很好,谢谢你...第二个问题,我有这个,我怎么可以从网址的内容,并把变量..我工作的PHP,在PHP中我们有file_put_contents和相同的内容与变量,在Android我知道我该怎么做,谢谢 – persian

+0

@persian:most wc :)接受n upvote – kevz

+0

@persian:查看我的编辑 – kevz

1

有些库可以帮助你解析Json,你可以使用gsonJackson。我实际上使用了retrofit 来调用我的API,因为它允许你插入一个json解串器,然后它只是为你做所有的工作。它还处理所有的HTTP调用,使用起来相当简单。

1

建议您与Volley一起去。下面是同一

JsonObjectRequest jsonObjReqfirst = new JsonObjectRequest(Request.Method.GET,urlBuffer.toString(),null, 
        new Response.Listener<JSONObject>(){ 

         @Override 
         public void onResponse(JSONObject response) { 
          Log.i(Constants.NETLOG, "Volley response= " + response.toString()); 
          getResponseprocessed(response)); 

         } 
        }, new Response.ErrorListener(){ 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.e(Constants.NETLOG, "VolleyError response= " + error.toString()); 

       } 
      }); 
      Volley.newRequestQueue(mContext).add(jsonObjReqfirst); 

void getResponseprocessed(JSONObject response){ 
      try { 
       JSONObject statusObj = response.getJSONObject("employee"); 
       String mseg=statusObj.getString("mesg"); 
       int status = statusObj.getInt("status"); 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
    }