在這裏看了很多後,我還沒有發現類似於這個問題的東西。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
登錄您的迴應。它看起來不是JSON,它的第一個字符是's'。 –
嘗試使用JSON.parse。還可以共享解析json的JavaScript代碼片段。 – Daenarys
@Daenarys我會在哪裏添加? – BilalMH