Ich möchte String-Json von meiner API mit Retrofit 2 erhalten. Ich habe kein Problem, wenn Sie Retrofit 1 verwenden, um diesen Json zu erhalten, aber Retrofit 2 liefert für mich null.
So sieht mein Json aus
{"id":1,"Username":"admin","Level":"Administrator"}
Dies ist meine API
@FormUrlEncoded
@POST("/api/level")
Call<ResponseBody> checkLevel(@Field("id") int id);
So sieht mein Code aus
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Config.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
Api api = retrofit.create(Api.class);
Call<ResponseBody> call = api.checkLevel(1);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
JsonObject post = new JsonObject().get(response.body().toString()).getAsJsonObject();
if (post.get("Level").getAsString().contains("Administrator")) {
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
Ich bin neu, um 2 nachzurüsten und den obigen Code zu verwenden. Meine Apps stürzen immer ab, weil response.body().toString()
null zurückgibt.
Bitte leite mich, wie ich die Json-Saite bekomme, damit ich sie in JsonObject konvertieren kann.
Verwenden Sie diesen link , um Ihre JSON in POJO mit Auswahloptionen zu konvertieren, die in der Abbildung unter ausgewählt sind.
Für diese Antwort erhalten Sie eine POJO-Klasse
public class Result {
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("Username")
@Expose
private String username;
@SerializedName("Level")
@Expose
private String level;
/**
*
* @return
* The id
*/
public Integer getId() {
return id;
}
/**
*
* @param id
* The id
*/
public void setId(Integer id) {
this.id = id;
}
/**
*
* @return
* The username
*/
public String getUsername() {
return username;
}
/**
*
* @param username
* The Username
*/
public void setUsername(String username) {
this.username = username;
}
/**
*
* @return
* The level
*/
public String getLevel() {
return level;
}
/**
*
* @param level
* The Level
*/
public void setLevel(String level) {
this.level = level;
}
}
und verwenden Sie die Schnittstelle wie folgt:
@FormUrlEncoded
@POST("/api/level")
Call<Result> checkLevel(@Field("id") int id);
und Aufruf wie folgt:
Call<Result> call = api.checkLevel(1);
call.enqueue(new Callback<Result>() {
@Override
public void onResponse(Call<Result> call, Response<Result> response) {
response.body(); // have your all data
int id =response.body().getId();
String userName = response.body().getUsername();
String level = response.body().getLevel();
}
@Override
public void onFailure(Call<Result> call, Throwable t) {
}
});
und verwenden Sie Abhängigkeiten in Gradale
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.+'
NOTE: Der Fehler tritt auf, weil Sie Ihre JSON in POJO geändert haben (mithilfe von addConverterFactory(GsonConverterFactory.create())
in Retrofit). Wenn Sie eine Antwort in JSON wünschen, entfernen Sie addConverterFactory(GsonConverterFactory.create())
aus Retrofit. Wenn nicht, dann verwenden Sie die obige Lösung
Wenn Sie eine vollständige Antwort im JSON-Format erhalten möchten, versuchen Sie Folgendes:
Ich habe einen neuen Weg ausprobiert, um eine vollständige Antwort vom Server im JSON-Format zu erhalten, ohne eine Modellklasse zu erstellen. Ich verwende keine Modellklasse, um Daten von Server abzurufen, da ich nicht weiß, welche Antwort ich erhalten werde, oder dass sich dies je nach Anforderungen ändern kann.
das ist JSON Antwort:
{"contacts": [
{
"id": "c200",
"name": "sunil",
"email": "[email protected]",
"address": "xx-xx-xxxx,x - street, x - country",
"gender" : "male",
"phone": {
"mobile": "+91 0000000000",
"home": "00 000000",
"office": "00 000000"
}
},
{
"id": "c201",
"name": "Johnny Depp",
"email": "[email protected]",
"address": "xx-xx-xxxx,x - street, x - country",
"gender" : "male",
"phone": {
"mobile": "+91 0000000000",
"home": "00 000000",
"office": "00 000000"
}
},
.
.
.
]}
Ändern Sie in Ihrer API-Schnittstelle den Parameter
public interface ApiInterface {
@POST("/index.php/User/login")//your api link
@FormUrlEncoded
Call<Object> getmovies(@Field("user_email_address") String title,
@Field("user_password") String body);
}
in Ihrer Haupttätigkeit, wo Sie das nennen
ApiInterface apiService =
ApiClient.getClient().create(ApiInterface.class);
Call call = apiService.getmovies("[email protected]","123456");
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
Log.e("TAG", "response 33: "+new Gson().toJson(response.body()) );
}
@Override
public void onFailure(Call call, Throwable t) {
Log.e("TAG", "onFailure: "+t.toString() );
// Log error here since request failed
}
});
danach können Sie Parameter normalerweise mithilfe von JSON-Objekten und JSON-Arrays erhalten
verwenden Sie dies, um String zu erhalten
String res = response.body().string();
anstatt
String res = response.body().toString();
und überprüfen Sie immer auf null, bevor Sie Responsebody in String konvertieren
if(response.body() != null){
//do your stuff
}
Sie können es so verwenden.
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
if (response.isSuccessful()) {
try {
JSONObject jsonObject = new JSONObject(new Gson().toJson(response.body()));
msg = jsonObject.getString("msg");
status = jsonObject.getBoolean("status");
msg = jsonObject.getString("msg");
status = jsonObject.getBoolean("status");
} catch (JSONException e) {
e.printStackTrace();
}
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
Log.e("cvbnop",response.body().toString());
} else {
Toast.makeText(MainActivity.this, "Some error occurred...", Toast.LENGTH_LONG).show();
}
}
abhängigkeit für Retrofit2 hinzufügen
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
klasse für Basis-URL erstellen
public class ApiClient
{
public static final String BASE_URL = "base_url";
private static Retrofit retrofit = null;
public static Retrofit getClient() {
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
danach erstellen Sie ein Klassenmodell, um Wert zu erhalten
public class ApprovalModel {
@SerializedName("key_parameter")
private String approvalName;
public String getApprovalName() {
return approvalName;
}
}
schnittstellenklasse erstellen
public interface ApiInterface {
@GET("append_url")
Call<CompanyDetailsResponse> getCompanyDetails();
}
danach in der Hauptklasse
if(Connectivity.isConnected(mContext)){
final ProgressDialog mProgressDialog = new ProgressDialog(mContext);
mProgressDialog.setIndeterminate(true);
mProgressDialog.setMessage("Loading...");
mProgressDialog.show();
ApiInterface apiService =
ApiClient.getClient().create(ApiInterface.class);
Call<CompanyDetailsResponse> call = apiService.getCompanyDetails();
call.enqueue(new Callback<CompanyDetailsResponse>() {
@Override
public void onResponse(Call<CompanyDetailsResponse>call, Response<CompanyDetailsResponse> response) {
mProgressDialog.dismiss();
if(response!=null && response.isSuccessful()) {
List<CompanyDetails> companyList = response.body().getCompanyDetailsList();
if (companyList != null&&companyList.size()>0) {
for (int i = 0; i < companyList.size(); i++) {
Log.d(TAG, "" + companyList.get(i));
}
//get values
}else{
//show alert not get value
}
}else{
//show error message
}
}
@Override
public void onFailure(Call<CompanyDetailsResponse>call, Throwable t) {
// Log error here since request failed
Log.e(TAG, t.toString());
mProgressDialog.dismiss();
}
});
}else{
//network error alert box
}
Ich fand, dass eine Kombination der anderen Antworten funktioniert:
interface ApiInterface {
@GET("/someurl")
Call<ResponseBody> getdata()
}
apiService.getdata().enqueue(object : Callback {
override fun onResponse(call: Call, response: Response) {
val rawJsonString = response.body()?.string()
}
})
Der wichtige Teil ist, dass der Antworttyp ResponseBody
ist und response.body()?.string()
verwendet wird, um die Rohzeichenfolge abzurufen.
Besser ist es, wenn Retrofit aus dem Json POJO (mit gson
) für Sie generiert. Als erstes fügen Sie .addConverterFactory(GsonConverterFactory.create())
hinzu, wenn Sie Ihre Retrofit
-Instanz erstellen. Wenn Sie beispielsweise eine User
-Java-Klasse (z. B. unten) haben, die Ihrem Json entspricht, könnte Ihr Retrofit-API Call<User>
class User {
private String id;
private String Username;
private String Level;
...
}
Also hier ist der Deal:
Bei der Herstellung von
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Config.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
Sie übergeben hier GsonConverterFactory.create (). Wenn Sie es so machen, konvertiert Gson automatisch das Json-Objekt, das Sie als Antwort auf Ihr Objekt <ResponseBody>
erhalten. Hier können Sie alle anderen Konverter wie Jackson usw. passieren ...
Wenn Sie keine Ahnung haben, was die Antwort der API sein könnte. Befolgen Sie die Schritte, um den Antwortkörper-Antwortwert in Bytes umzuwandeln und im String-Format zu drucken. Sie können die gesamte Antwort in der Konsole ausdrucken.
Dann können Sie den String einfach in JSONObject konvertieren.
apiService.getFeeds(headerMap, map).enqueue(object : Callback, retrofit2.Callback<ResponseBody> {
override fun onFailure(call: Call<ResponseBody>?, t: Throwable?) {
}
override fun onResponse(call: Call<ResponseBody>?, response: Response<ResponseBody>?) {
val bytes = (response!!.body()!!.bytes())
Log.d("Retrofit Success : ", ""+ String(bytes))
}
})