2017-06-05 123 views
-1

在這裏看了很多後,我還沒有發現類似於這個問題的東西。JSON不解析API調用

我從我的API調用中獲得JSON,但它不是解析我經歷了我正在使用的步驟,並得到解析錯誤SyntaxError: Unexpected token s in JSON at position 1我將發佈以下所有示例,希望有人可以告訴我我做錯了什麼(我一直在使用同樣的事情來解析其他對象已經和他們的工作不知道爲什麼,這並不)

預期JSON

{ 
"user":{ 
    "id":1054776, 
    "email":"[email protected]", 
    "username":"user1496654688", 
    "first_name":null, 
    "last_name":null, 
    "last_login":null, 
    "email_confirmed":false 
    } 
} 

RegisterRequest.java

public class RegisterRequest { 

    private Context mContext; 
    private Map<String, String> mCredentials; 

    public interface RegisterFeedback{ 
     void onRegisterSuccess(RegisterResponse response); 
     void onRegisterFailed(Exception exception); 
    } 

    public RegisterRequest(Context context) { 
     mContext = context; 
    } 

    public void sendRegistration(String email, String password, RegisterFeedback feedback) { 
     String url = Constants.BASE_URL + Constants.REGISTRATION_URL; 
     Gson gson = new Gson(); 
     mCredentials = new HashMap<>(); 
     mCredentials.put("email", email); 
     mCredentials.put("password", password); 

     final RegisterFeedback registerFeedback = feedback; 

     GsonRequest<RegisterResponse> request = new GsonRequest<>(url, RegisterResponse.class, null, 
       Request.Method.POST, mCredentials, new Response.Listener<RegisterResponse>() { 
      @Override 
      public void onResponse(RegisterResponse response) { 
       registerFeedback.onRegisterSuccess(response); 
       PreferenceConnector.writeString(mContext, "authToken", response.getAccessToken()); 

      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       registerFeedback.onRegisterFailed(error); 

      } 
     }); 

     request.setRetryPolicy(new DefaultRetryPolicy(
       10000, 
       DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
       DefaultRetryPolicy.DEFAULT_BACKOFF_MULT 
     )); 

     RequestFactory.getInstance(mContext).addtoRequestQueue(request); 

    } 

} 

RegisterResponse.java

@Parcel 
public class RegisterResponse { 

    @SerializedName("id") 
    private String id; 
    @SerializedName("email") 
    private String email; 
    @SerializedName("username") 
    private String username; 
    @SerializedName("first_name") 
    private String firstName; 
    @SerializedName("last_name") 
    private String lastName; 
    @SerializedName("last_login") 
    private String lastLogin; 
    @SerializedName("email_confirmed") 
    private String emailConfirmed; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getLastLogin() { 
     return lastLogin; 
    } 

    public void setLastLogin(String lastLogin) { 
     this.lastLogin = lastLogin; 
    } 

    public String isEmailConfirmed() { 
     return emailConfirmed; 
    } 

    public void setEmailConfirmed(String emailConfirmed) { 
     this.emailConfirmed = emailConfirmed; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 
} 

GsonRequest.java

public class GsonRequest<T> extends JsonRequest<T> { 

    private final Gson gson = new Gson(); 
    private Map<String, String> bodyJson; 
    private final Class<T> clazz; 
    private Map<String, String> headers; 
    private Response.Listener<T> listener; 
    private static final String CONTENT_TYPE = "Content-Type"; 

    private static final String PROTOCOL_CONTENT_TYPE = 
      String.format("application/x-www-form-urlencoded"); 

    public GsonRequest(String url, Class<T> clazz, Map<String, String> headers, int method, @Nullable Map<String, String> bodyJson, 
         Response.Listener<T> listener, Response.ErrorListener errorListener) { 

     super(method, url, getFormDataString(bodyJson), listener, errorListener); 
     this.clazz = clazz; 
     this.listener = listener; 
     this.bodyJson = bodyJson; 

     if (headers == null) { 
      this.headers = new HashMap<>(); 
     } else { 
      this.headers = headers; 
     } 

     this.headers.put("client-id", Constants.API_CLIENT_ID); 
     this.headers.put("client_secret", Constants.API_CLIENT_SECRET); 
     this.headers.put("Accept-Encoding", "gzip, deflate, sdch"); 
    } 

    private static String getFormDataString(Map<String, String> formData){ 

     StringBuilder params = new StringBuilder(); 
     if (formData != null) { 
      for (String key : formData.keySet()) { 
       params.append("&").append(key).append("=").append(formData.get(key)); 
      } 

      return params.toString().substring(1); 
     }else { 
      return null; 
     } 
    } 

    @Override 
    public Map<String, String> getParams() throws AuthFailureError { 
     return bodyJson != null ? bodyJson : super.getParams(); 
    } 

    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     return headers != null ? headers : super.getHeaders(); 
    } 

    @Override 
    public String getBodyContentType() { 
     return PROTOCOL_CONTENT_TYPE; 
    } 

    @Override 
    protected void deliverResponse(T response){ 
     listener.onResponse(response); 
    } 

    @Override 
    protected Response<T> parseNetworkResponse(NetworkResponse response) { 
     try { 
      String json; 
      String encoding = response.headers.get("Content-Encoding"); 

      if (encoding != null && encoding.equals("gzip")) { 
       json = unpackData(response.data); 
      } else { 
       json = new String (
         response.data, HttpHeaderParser.parseCharset(response.headers)); 
      } 

      return Response.success(gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response)); 


     } catch (UnsupportedEncodingException e) { 
      return Response.error(new ParseError(e)); 
     } catch (JsonSyntaxException e) { 
      return Response.error(new ParseError(e)); 
     } 
    } 

    private String unpackData(byte[] data) { 
     String output = ""; 

     try { 
      GZIPInputStream gStream = new GZIPInputStream(new ByteArrayInputStream(data)); 
      InputStreamReader reader = new InputStreamReader(gStream); 
      BufferedReader in = new BufferedReader(reader); 
      String read; 
      while ((read = in.readLine()) != null) { 
       output += read; 
      } 
      reader.close(); 
      in.close(); 
      gStream.close(); 
     } catch (IOException e) { 
      return null; 
     } 

     return output; 
    } 


} 

任何幫助將不勝感激,提前謝謝您:D

+0

登錄您的迴應。它看起來不是JSON,它的第一個字符是's'。 –

+0

嘗試使用JSON.parse。還可以共享解析json的JavaScript代碼片段。 – Daenarys

+0

@Daenarys我會在哪裏添加? – BilalMH

回答

1

您的預期JSON在「email_confirmed」末尾有逗號:false, 請糾正它,然後重試。

+0

之後還有3個字段,最後一個字段上沒有逗號。 – BilalMH

+0

'user'是JSON對象。我沒有看到任何提供從JSON對象提取數據以將其解析到RegisterResponse數據的規定。 在您的web api響應方法中嘗試如下所示: JSONObject userObject = obj.getJSONObject(「user」); Gson gson = new Gson(); RegisterResponse registerResponse = gson.fromJson(userObject.toString(),RegisterResponse.class); 實現相同的自定義json對象請求類。希望它有幫助/ – Ct9

+0

我沒有web api響應方法?對不起,這使我感到困惑 – BilalMH