使用 Retrofit 库获得简单的 JSON 对象响应
Getting simple JSON object response using Retrofit library
我有一个网络查询 JSON 响应为:
{
"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);
在调试器中,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();
您可以使用使用 Response class 的 Retrofit 基本回调,而不是使用 JSONObject class 的回调,然后,一旦您获得响应,就必须从中创建 JSONObject。
看这个:
否则您可以创建自己的模型class来处理响应。
首先是结果 class:
public class Result {
public int id;
public String name;
public String email;
public String password;
public boolean status;
public Date created;
}
然后您的回复 class 用于 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);
试试这个:
@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();
我正在使用此站点从 JSON 创建我的 类 (POJO)。
http://www.jsonschema2pojo.org/
只需确保设置为 JSON insted of JSON Schema 并检查 GSON,因为改造也使用 GSON 进行解析。
你的改造代码看起来不错。
您可以像下面这样创建自定义工厂或从此处复制它:
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;
}
}
}
在设置 Retrofit 时使用 JacksonConverterFactory 而不是 GsonConverterFactory。现在您可以直接使用 JsonObject 响应。
编译'com.squareup.retrofit2:converter-jackson:2.1.0'
只需使用 [=h11=] 而不是 JSONobject
。卢克:
@GET("/stockers/login")
Call<JsonElement> getLogin(
@Query("email") String email,
@Query("password") String password
);
Retrofit 1 的答案有点旧,如果您使用的是 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());
只需要定义你想要获取的对象的类型为String 为com.google.gson.JsonObject 而不是String 然后调用.toString() 在该对象上获取 JSON 字符串本身。
我有一个网络查询 JSON 响应为:
{
"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);
在调试器中,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();
您可以使用使用 Response class 的 Retrofit 基本回调,而不是使用 JSONObject class 的回调,然后,一旦您获得响应,就必须从中创建 JSONObject。
看这个:
否则您可以创建自己的模型class来处理响应。
首先是结果 class:
public class Result {
public int id;
public String name;
public String email;
public String password;
public boolean status;
public Date created;
}
然后您的回复 class 用于 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);
试试这个:
@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();
我正在使用此站点从 JSON 创建我的 类 (POJO)。
http://www.jsonschema2pojo.org/ 只需确保设置为 JSON insted of JSON Schema 并检查 GSON,因为改造也使用 GSON 进行解析。
你的改造代码看起来不错。
您可以像下面这样创建自定义工厂或从此处复制它: 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;
}
}
}
在设置 Retrofit 时使用 JacksonConverterFactory 而不是 GsonConverterFactory。现在您可以直接使用 JsonObject 响应。
编译'com.squareup.retrofit2:converter-jackson:2.1.0'
只需使用 [=h11=] 而不是 JSONobject
。卢克:
@GET("/stockers/login")
Call<JsonElement> getLogin(
@Query("email") String email,
@Query("password") String password
);
Retrofit 1 的答案有点旧,如果您使用的是 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());
只需要定义你想要获取的对象的类型为String 为com.google.gson.JsonObject 而不是String 然后调用.toString() 在该对象上获取 JSON 字符串本身。