2013-08-09 10 views
1
내 로그 캣에서이 오류를 얻고있다

구문 분석 오류가 점점 오전 : 나는 데이터 org.json.JSONException

Error parsing data org.json.JSONException: Value  of type java.lang.String cannot be converted to JSONArray 

아래는 내가 당신을 보여줄 수있는 모든 파일입니다! 최대한 빨리 문제와 해결책을 알려주십시오. 내가 생각하기에 : 1. 문제는 JSON 배열의 데이터를 파싱하는 것일 수 있습니다. 2. 어쩌면 문제는 내 php api와 함께, 나는 json_encode를 제대로 인코딩하지 못한다고 생각한다. 왜냐하면 그것은 한 줄에있는 모든 것처럼 RAW JSON을 제공하기 때문이다.

[{"uid":"120","name":"MyFirstName MyLastName"}] 

도 알려 주시기 바랍니다, 두 형식의 작업에 약간의 차이가있다 1. 원시 JSON과 2들이 의도 JSON 아래

아래로

가들이 의도 JSON 형식

입니다
[ 
    { 
    "uid":"120", 
    "name":"MyFirstName MyLastName" 
    } 
] 

여기에 JSONUseActivity.java

package com.example.oncemore; 
import java.util.ArrayList; 
import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.StrictMode; 

import com.example.oncemore.CustomHttpClient; 

import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class JSONUseActivity extends Activity { 

EditText email,password; 
Button submit; 
TextView tv; // TextView to show the result of MySQL query 
String returnString; // to store the result of MySQL query after decoding 
// JSON 
/** Called when the activity is first created. */ 
@Override 

public void onCreate(Bundle savedInstanceState) { 
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
    .detectDiskReads().detectDiskWrites().detectNetwork() // StrictMode is 
      // most commonly 
      // used to catch 
      // accidental 
      // disk or 
      // network 
      // access on the 
      // application's 
      // main thread 
      .penaltyLog().build()); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_jsonuse); 

    email = (EditText) findViewById(R.id.email); 
    password = (EditText) findViewById(R.id.password); 
    submit = (Button) findViewById(R.id.submitbutton); 
    tv = (TextView) findViewById(R.id.showresult); 

    // define the action when user clicks on submit button 
    submit.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      // declare parameters that are passed to PHP script i.e. the 
      ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>(); 
      // define the parameter 
      postParameters.add(new BasicNameValuePair("email",email.getText().toString())); 
      postParameters.add(new BasicNameValuePair("password",password.getText().toString())); 
      String response = null; 
      // call executeHttpPost method passing necessary parameters 
      try { 
       response = CustomHttpClient.executeHttpPost(
         "http://mywebsite.com/android/api.php", 
         postParameters); 
       // store the result returned by PHP script that runs MySQL 
       // query 
       String result = response.toString(); 
       // parse json data 
       try { 
        returnString = ""; 
    //I think the line below is creating some problem 
        JSONArray jArray = new JSONArray(result); 
        for (int i = 0; i < jArray.length(); i++) { 
         JSONObject json_data = jArray.getJSONObject(i); 
         Log.i("log_tag", 
         "id: " + json_data.getInt("uid")+", name: " + json_data.getString("name")); 
         // Get an output to the screen 
         returnString += "\n" + json_data.getString("name") 
           + " -> " + json_data.getInt("uid"); 
        } 
       }catch (JSONException e) { 
        Log.e("log_tag", "Error parsing data " + e.toString()); 
       } 
       try { 
        tv.setText(returnString); 
       } 
       catch (Exception e) { 
        Log.e("log_tag", "Error in Display!" + e.toString()); 
        ; 
       } 
      } 
      catch (Exception e) { 
       Log.e("log_tag", 
         "Error in http connection!!" + e.toString()); 
      } 
     } 
    }); 
} 

} 여기

다음은 api.php 내가 고토 브라우저,

<?php 
require_once("../contactdb.php"); 
$myusername=$_REQUEST["email"]; 
$mypassword=$_REQUEST["password"]; 
// To protect MySQL injection (more detail about MySQL injection) 
$myusername = stripslashes($myusername); 
$mypassword = stripslashes($mypassword); 
$myusername = mysql_real_escape_string($myusername); 
$mypassword = mysql_real_escape_string($mypassword); 
$sql="SELECT uid,name FROM u_info WHERE email='".$myusername."' AND password ='".$mypassword."'"; 
$result=mysql_query($sql); 
// Mysql_num_row is counting table row 
$count=mysql_num_rows($result); 
if($count==1){ 
    while($row=mysql_fetch_assoc($result)) 
    $output[]=$row; 
    echo json_encode($output); 
    mysql_close(); 
}else{ 
    echo "Error Occured!"; 
} 
?> 

마지막이며,이

http://mywebsite.com/android/[email protected]&password=1234 
처럼 쓰기 CustomHttpClient.java

package com.example.oncemore; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URI; 
import java.util.ArrayList; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.conn.params.ConnManagerParams; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.params.HttpConnectionParams; 
import org.apache.http.params.HttpParams; 
import android.util.Log; 

public class CustomHttpClient { 
/** The time it takes for our client to timeout */ 
public static final int HTTP_TIMEOUT = 30 * 1000; // milliseconds 
/** Single instance of our HttpClient */ 
private static HttpClient mHttpClient; 
/** 
    * Get our single instance of our HttpClient object. 
    * 
    * @return an HttpClient object with connection parameters set 
    */ 
private static HttpClient getHttpClient() { 
    if (mHttpClient == null) { 
    mHttpClient = new DefaultHttpClient(); 
    final HttpParams params = mHttpClient.getParams(); 
    HttpConnectionParams.setConnectionTimeout(params, HTTP_TIMEOUT); 
    HttpConnectionParams.setSoTimeout(params, HTTP_TIMEOUT); 
    ConnManagerParams.setTimeout(params, HTTP_TIMEOUT); 
    } 
    return mHttpClient; 
} 
/** 
    * Performs an HTTP Post request to the specified url with the specified 
    * parameters. 
    * 
    * @param url 
    *   The web address to post the request to 
    * @param postParameters 
    *   The parameters to send via the request 
    * @return The result of the request 
    * @throws Exception 
    */ 
public static String executeHttpPost(String url, ArrayList<NameValuePair> postParameters) throws Exception { 
    BufferedReader in = null; 
    try { 
    HttpClient client = getHttpClient(); 
    HttpPost request = new HttpPost(url); 
    UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters); 
    request.setEntity(formEntity); 
    HttpResponse response = client.execute(request); 
    in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
    StringBuffer sb = new StringBuffer(""); 
    String line = ""; 
    String NL = System.getProperty("line.separator"); 
    while ((line = in.readLine()) != null) { 
    sb.append(line + NL); 
    } 
    in.close(); 
    String result = sb.toString(); 
    return result; 
    } finally { 
    if (in != null) { 
    try { 
    in.close(); 
    } catch (IOException e) { 
    Log.e("log_tag", "Error converting result "+e.toString()); 
    e.printStackTrace(); 
    } 
    } 
    } 
} 
/** 
    * Performs an HTTP GET request to the specified url. 
    * 
    * @param url 
    *   The web address to post the request to 
    * @return The result of the request 
    * @throws Exception 
    */ 
public static String executeHttpGet(String url) throws Exception { 
    BufferedReader in = null; 
    try { 
    HttpClient client = getHttpClient(); 
    HttpGet request = new HttpGet(); 
    request.setURI(new URI(url)); 
    HttpResponse response = client.execute(request); 
    in = new BufferedReader(new InputStreamReader(response.getEntity() 
    .getContent())); 
    StringBuffer sb = new StringBuffer(""); 
    String line = ""; 
    String NL = System.getProperty("line.separator"); 
    while ((line = in.readLine()) != null) { 
    sb.append(line + NL); 
    } 
    in.close(); 
    String result = sb.toString(); 
    return result; 
    } finally { 
    if (in != null) { 
    try { 
    in.close(); 
    } catch (IOException e) { 
    Log.e("log_tag", "Error converting result "+e.toString()); 
    e.printStackTrace(); 
    } 
    } 
    } 
} 
} 

입니다

나는이 json 배열을 얻었다!

[{"uid":"120","name":"MyFirstName MyLastName"}] 

그래서 Google은 전 json 배열의 다른 형식을 발견했습니다. 나는 사방에 존재하는 존슨을 발견했다. 내 json 배열은 현재 Raw Json 형식입니다. Raw Json 형식을 Intented Json 형식으로 변환하는 방법을 어디에서도 찾을 수 없습니다.

미리 감사드립니다. 도움이 될 것입니다. 가능한 경우 정확한 코드를 입력하십시오! 유효한 JSON 구문이 아니다

+0

오류가 발생했습니다. 'String result = response.toString();'응답은 응답의 문자열 값 옆에 많은 것을 포함하는 객체입니다 . 당신은 실제로 그것을 읽을 필요가 있습니다. – njzk2

+0

출력을 '에코'하기 전에'header ('Content-type : application/json');'을 사용할 수 있습니다. json 데이터가 브라우저로 전송됩니다. –

+0

그 응답은 유효한 JSON이 아닙니다. 배열 식별자가없는 json 배열입니다. 들여 쓰기와 아무 관련이 없습니다. – o0rebelious0o

답변

1

는 :

{ 
    "employees": [ 
     { "firstName":"John" , "lastName":"Doe" }, 
     { "firstName":"Anna" , "lastName":"Smith" }, 
     { "firstName":"Peter" , "lastName":"Jones" } 
    ] 
} 

유효합니다.

주의 : 이는 또한 유효 :

{"employees": [ { "firstName":"John" , "lastName":"Doe" }, { "firstName":"Anna" , "lastName":"Smith" }, { "firstName":"Peter" , "lastName":"Jones" } ] }

구문 구조 압입 조건에서 서식 중요한 부분은 아니다.

달리 말하지만 반환 할 글꼴을 사용하려면 응답에서 하위 문자열을 잘라야합니다. 즉 중괄호를 둘러싸는 대괄호를 제거해야합니다.다음과 같이 PHP에서

나는 적절한 JSON 응답을 만들 :

// array for JSON response 
$response = array(); 
$response["apps"] = array(); 

$apps = array(); 

$apps["name"] = $row["name"]; 
$apps["package"] = $row["package"]; 
$apps["version"] = $row["version"]; 
$apps["dateversion"] = $row["dateversion"]; 

array_push($response["apps"], $apps); 

$response["success"] = 1; 

echo json_encode($response); 

이 기본적으로 당신이 할 수 JSON 클래스의 풍부한 예제의 올바르게 구문 분석 할 수

{ "success":"1", "apps":{["name":"NAME", "package":"PACKAGE", "version":"VERSION", "dateversion":"DATEVERSION"]}} 

을 제공합니다 사용. 해킹과 하위 문자열을 사용하여 수동으로 첫 번째 N 문자를 제거하는 것은 바람직하지 않습니다. ...

+0

도움을 주셔서 감사합니다! 내 콘텐츠를 이렇게 만들려면 어떻게해야합니까? 도와 주셔서 다시 한번 감사드립니다! – Yasir

관련 문제