我有一个带有JSON响应的Web查询:
{
"status":true,
"result":
{
"id":"1",
"name":"ABC 1",
"email":"info@ABc.dcom",
"password":"123456",
"status":false,
"created":"0000-00-00 00:00:00"
},
"message":"Login successfully"
}
我使用以下代码:
@GET("/stockers/login")
public void login(
@Query("email") String email,
@Query("password") String password,
Callback<JSONObject> callback);
在Debugger中,Retrofit库所做的查询是正确的,但是我得到了一个空的JSON作为响应。
ApiManager.getInstance().mUrlManager.login(
email.getText().toString().trim(),
password.getText().toString().trim(),
new Callback<JSONObject>()
{
@Override
public void success(JSONObject jsonObj, Response response)
{
mDialog.dismiss();
答案 0 :(得分:7)
只需使用raise
的{{1}}内容即可。像:
JsonElement
答案 1 :(得分:5)
使用ReSONofit基本回调代替使用JSONObject类的回调,然后,一旦得到响应,就必须从中创建JSONObject。
看到这个: https://stackoverflow.com/a/30870326/2037304
否则,您可以创建自己的模型类来处理响应。
首先是Result类:
public class Result {
public int id;
public String name;
public String email;
public String password;
public boolean status;
public Date created;
}
然后你的响应类与Retrofit一起使用
public class MyResponse {
public boolean status;
public Result result;
public String message;
}
现在你可以致电:
@GET("/stockers/login")
public void login(
@Query("email") String email,
@Query("password") String password,
Callback<MyResponse> callback);
答案 2 :(得分:3)
如果您使用的是Retrofit 2,并且不想使用转换器,则必须使用ResponseBody
@GET("/stockers/login")
public void login(
@Query("email") String email,
@Query("password") String password,
Callback<ResponseBody> callback);
然后在主体上onResponse
方法调用string
的回调中,从中创建一个JSONObject。
if(response.isSuccessful())
JSONObject json = new JSONObject(response.body().string());
答案 3 :(得分:2)
试试这个:
@GET("/stockers/login")
public void login(
@Query("email") String email,
@Query("password") String password,
Callback<Response> callback); // set the callback generic parameter to Response
ApiManager.getInstance().mUrlManager.login(
email.getText().toString().trim(),
password.getText().toString().trim(),
new Callback<Response>()
{
@Override
public void success(Response response, Response response1)
{
String json = response.getBody();
try {
JSONObject jsonObj = new JSONObject(json);
} catch(JSONException e) {
}
alog.dismiss();
答案 4 :(得分:2)
您可以创建自己的自定义工厂,也可以从此处复制: https://github.com/marcinOz/Retrofit2JSONConverterFactory
public class JSONConverterFactory extends Converter.Factory {
public static JSONConverterFactory create() {
return new JSONConverterFactory();
}
private JSONConverterFactory() {
}
@Override public Converter<?, RequestBody> requestBodyConverter(Type type,
Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
if (type == JSONObject.class
|| type == JSONArray.class) {
return JSONRequestBodyConverter.INSTANCE;
}
return null;
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
Retrofit retrofit) {
if (type == JSONObject.class) {
return JSONResponseBodyConverters.JSONObjectResponseBodyConverter.INSTANCE;
}
if (type == JSONArray.class) {
return JSONResponseBodyConverters.JSONArrayResponseBodyConverter.INSTANCE;
}
return null;
}
}
public class JSONRequestBodyConverter<T> implements Converter<T, RequestBody> {
static final JSONRequestBodyConverter<Object> INSTANCE = new JSONRequestBodyConverter<>();
private static final MediaType MEDIA_TYPE = MediaType.parse("text/plain; charset=UTF-8");
private JSONRequestBodyConverter() {
}
@Override public RequestBody convert(T value) throws IOException {
return RequestBody.create(MEDIA_TYPE, String.valueOf(value));
}
}
public class JSONResponseBodyConverters {
private JSONResponseBodyConverters() {}
static final class JSONObjectResponseBodyConverter implements Converter<ResponseBody, JSONObject> {
static final JSONObjectResponseBodyConverter INSTANCE = new JSONObjectResponseBodyConverter();
@Override public JSONObject convert(ResponseBody value) throws IOException {
try {
return new JSONObject(value.string());
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}
static final class JSONArrayResponseBodyConverter implements Converter<ResponseBody, JSONArray> {
static final JSONArrayResponseBodyConverter INSTANCE = new JSONArrayResponseBodyConverter();
@Override public JSONArray convert(ResponseBody value) throws IOException {
try {
return new JSONArray(value.string());
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}
}
答案 5 :(得分:0)
我正在使用此站点从JSON创建我的类(POJO)。
http://www.jsonschema2pojo.org/ 只需确保设置为JSON Schema的JSON并检查GSON,因为改造使用GSON进行解析。
您的改装代码看起来很好。
答案 6 :(得分:0)
在设置Retrofit时使用JacksonConverterFactory而不是GsonConverterFactory。现在,您可以直接使用JsonObject响应。
compile&#39; com.squareup.retrofit2:converter-jackson:2.1.0&#39;
答案 7 :(得分:0)
只需将要获取为String的对象的类型定义为 com.google.gson.JsonObject 即可,而不是String并在其上调用.toString()对象来获取JSON字符串本身。