wake-up-neo.com

Nachrüstung 2: Holen Sie sich JSON aus dem Antworttext

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.

32
Dirus

Verwenden Sie diesen link , um Ihre JSON in POJO mit Auswahloptionen zu konvertieren, die in der Abbildung unter ausgewählt sind.

 enter image description here

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

37
Sushil Kumar

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"
        }
    },
    .
    .
    .
]}
  1. Ä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);
    }
    
  2. 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
        }
    });
    
  3. danach können Sie Parameter normalerweise mithilfe von JSON-Objekten und JSON-Arrays erhalten

Ausgabe  enter image description here

26
Sunil

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();
            }
        }
3
Krishna

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

        }
2
Mahesh Pandit

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.

https://stackoverflow.com/a/33286112/860488

1

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;
    ...
}    
1
John O'Reilly

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 ...

1
Vulovic Vukasin

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))
            }
        })
0
Sackurise