I am practising with retrofit and i am having an error as
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was NUMBER at line 1 column 31 path $.total_results
I am using this api https://api.themoviedb.org/3/movie/550?api_key=########################
here is my code
MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final String Tag=MainActivity.class.getSimpleName();
private static final String APIKEY="###########################";
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ProgressDialog pDialog= new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();
final RecyclerView recyclerView =(RecyclerView)findViewById(R.id.recyclerMovie);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
ApiInterface apiService= ApiClient.getClient().create(ApiInterface.class);
Call<MovieResponse> call =apiService.getTopRatedMovie(APIKEY);
call.enqueue(new Callback<MovieResponse>() {
#Override
public void onResponse(Call<MovieResponse> call, Response<MovieResponse> response) {
List<Movie> movies=response.body().getResults();
Log.d(Tag, "Numbers Of Movies Received"+ movies.size());
MovieAdapter adapter =new MovieAdapter(movies,R.layout.list_item_movies,getApplicationContext());
recyclerView.setAdapter(adapter);
pDialog.dismiss();
}
#Override
public void onFailure(Call<MovieResponse> call, Throwable t) {
Log.d(Tag,"Error:-"+t.toString());
pDialog.dismiss();
Toast.makeText(getApplicationContext(),"Oops Error...",Toast.LENGTH_SHORT).show();
}
});
}}
Movie.java
public class Movie {
#SerializedName("poster_path")
#Expose
private String posterPath;
#SerializedName("adult")
#Expose
private boolean adult;
#SerializedName("overview")
#Expose
private String overview;
#SerializedName("release_date")
#Expose
private String releaseDate;
#SerializedName("genre_ids")
#Expose
private List<Integer> genreIds = new ArrayList<Integer>();
#SerializedName("id")
#Expose
private Integer id;
#SerializedName("original_title")
#Expose
private String originalTitle;
#SerializedName("original_language")
#Expose
private String originalLanguage;
#SerializedName("title")
#Expose
private String title;
#SerializedName("backdrop_path")
#Expose
private String backdropPath;
#SerializedName("popularity")
#Expose
private Double popularity;
#SerializedName("vote_count")
#Expose
private Integer voteCount;
#SerializedName("video")
#Expose
private Boolean video;
#SerializedName("vote_average")
#Expose
private Double voteAverage;
public Movie(String posterPath, boolean adult, String overview, String releaseDate, List<Integer> genreIds, Integer id, String originalTitle, String originalLanguage, String title, String backdropPath, Double popularity, Integer voteCount, Boolean video, Double voteAverage) {
this.posterPath = posterPath;
this.adult = adult;
this.overview = overview;
this.genreIds = genreIds;
this.backdropPath = backdropPath;
this.id=id;
this.originalLanguage=originalLanguage;
this.originalTitle=originalTitle;
this.releaseDate=releaseDate;
this.title=title;
this.video=video;
this.voteAverage=voteAverage;
this.voteCount=voteCount;
this.popularity=popularity;
}
//getter and setter methods }
MovieResponse.java
public class MovieResponse {
#SerializedName("page")
#Expose
private int page;
#SerializedName("results")
#Expose
private List<Movie> results;
#SerializedName("total_pages")
#Expose
private int total_pages;
#SerializedName("total_results")
#Expose
private List<Movie> total_results;
//getter and setter methods}
ApiClient.java
public class ApiClient {
public static final String Base_URl="http://api.themoviedb.org/3/";
public static Retrofit retrofit=null;
public static Retrofit getClient(){
if(retrofit==null){
retrofit=new Retrofit.Builder()
.baseUrl(Base_URl)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}}
ApiInterface.java
public interface ApiInterface{
#GET("movie/top_rated")
Call<MovieResponse> getTopRatedMovie(#Query("api_key") String apiKey);
#GET("movie/{id}")
Call<MovieResponse> getMovieDetails(#Path("id") int id, #Query("api_key") String apiKey);
}
Please Give me the solution...
you created wrong object
#SerializedName("total_results")
#Expose
private List<Movie> total_results;
change to
#SerializedName("total_results")
#Expose
private Int total_results;
because as per your error it should be number of result and you created List so it will ask for ARRAY only.
If I am wrong then please copy your response and take pojo class from
http://www.jsonschema2pojo.org/
Look closely to your Movie.java POJO, especially to this field:
#SerializedName("genre_ids")
#Expose
private List<Integer> genreIds = new ArrayList<Integer>();
...which has type of List of Integers. In the JSON that you've provided this array contains an Objects instead of Integer ids. You can represent this object like this:
public class Genre {
#SerializedName("id")
#Expose
private int id;
#SerializedName("name")
#Expose
private String name;
}
Furthermore, the actual name of this array is genres (not the genres_ids). So, to avoid the parsing error the only thing you need is to change the field above to this:
#SerializedName("genres")
#Expose
private List<Genre> genres = new ArrayList< Genre >();
Happy coding! ;)
Related
1-this my model object for account , iwant to return a json result for post method and my problem that my code return null .=
public class Account implements Serializable {
private static final long serialVersionUID = 1L;
private long id;
private String accountType;
private String title;
private double lockedAmount;
private String lastUpdate;
private double balance;
private String currency;
private String rib;
private String Agency;
private String swiftcode;
private String ribURI;
private boolean canDebit;
private boolean canCredit;
private List<Operation> operation;
private List<Documents> documents;
2-this the class Operation :
public class Operation {
private String Descript;
private String ValueDate;
private String bookDate;
private String Reference;
private Integer Debit;
private Integer Credit;
private Integer ClosingBalance;
}
3-this is what i do in my controller :
//get Operation list by account id
#PostMapping("eAccount/Operations/Account/{id}")
public List<Operation> getOperationsByAccountId(#PathVariable long id, String bookDate) {
return operationService.getOperationsByAccountId(id, bookDate);
}
4-and the service :
//get Operation list by account id
public List<Operation> getOperationsByAccountId(#PathVariable long id, String bookDate) {
Account account = new Account();
account.setId(id);
String url = operationUrl;
account = resttemplate.postForObject(url,account, Account.class);
return account.getOperation();
}
5-i need to return this result :
{ "account": { "id": "100000000137",
"operation": [
{
"bookDate": "20160105 20160201" } ] } }
This question already has answers here:
Why does Gson fromJson throw a JsonSyntaxException: Expected BEGIN_OBJECT but was BEGIN_ARRAY?
(2 answers)
Closed 2 years ago.
I'M using retfofit2 and i have problem with creating model class
I cant creat model of this .json file...
I get in throwable wrong com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 12 path $.movies
I think this problem of child "movies": genres
My json
MainActivity
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://server/api/all/")
.addConverterFactory(GsonConverterFactory.create())
.build();
MainInterface mainApi = retrofit.create(MainInterface.class);
Call<MainModel> mainCall = mainApi.getMoviess();
mainCall.enqueue(new Callback<MainModel>() {
#Override
public void onResponse(Call<MainModel> call, Response<MainModel> response) {
Log.d("Retrofittt", "onResponse: ok");
}
#Override
public void onFailure(Call<MainModel> call, Throwable t) {
Log.d("Retrofittt", "onFailure: "+t);
}
});
MainModel
public class MainModel {
private String genre;
private MoviesBean movies;
//getter and setters
public class MoviesBean {
private String content_year;
private String content_id;
private String base_url;
private String base_url_link;
private String content_rating_age;
private String movie_link;
private String content_title;
private String content_text_small;
private String rating_kinopoisk;
private String rating_imdb;
private String rating_kinodelux;
private String link_to_movie;
private String content_poster_small;
private String content_poster;
private GenresBean genres;
///getters and setters
}
public class GenresBean {
private String genre_name;
private String genre_id;
private String base_url_link;
///getters and setters
}
}
MainInterface
interface MainInterface {
#GET("1")
Call<MainModel> getMoviess();
}
your interface would be like below
interface MainInterface {
#GET("1")
Call<ArrayList<MainModel>> getMoviess();
}
Because in your JSON it returns a list or your MainModel like MovieModel.
And in your case, you just get only MainModel from the response.
please try below code, hopes it'll help
public class MainModel {
private String genre;
private ArrayList<MoviesBean> movies;
//getter and setters
public class MoviesBean {
private String content_year;
private String content_id;
private String base_url;
private String base_url_link;
private String content_rating_age;
private String movie_link;
private String content_title;
private String content_text_small;
private String rating_kinopoisk;
private String rating_imdb;
private String rating_kinodelux;
private String link_to_movie;
private String content_poster_small;
private String content_poster;
private ArrayList<GenresBean> genres;
///getters and setters
}
public class GenresBean {
private String genre_name;
private String genre_id;
private String base_url_link;
///getters and setters
}
I know some threads have similar question, but I can't find the solution for me.
I am a beginner in mobile development. I little bit confused how to convert JSON string to normal JSON.
so I have JSON as string like below, this json string is generated from GSON that convert Java object to this JSON string:
products=%5B%7B%22customers_basket_date_added%22%3A%222019-04-22%2012%3A28%3A41%22%2C%22customers_basket_id%22%3A4%2C%22customers_basket_product%22%3A%7B%22attributes%22%3A%5B%5D%2C%22attributes_price%22%3A%220.0%22%2C%22categories_id%22%3A8%2C%22categories_name%22%3A%22Kemasan%20Botol%22%2C%22customers_basket_quantity%22%3A6%2C%22images%22%3A%5B%5D%2C%22isSale_product%22%3A%220%22%2C%22language_id%22%3A0%2C%22motorist_id%22%3A0%2C%22motorist_name%22%3A%22%22%2C%22id_jenis_products%22%3A0%2C%22qty_orders_max%22%3A12%2C%22qty_orders_min%22%3A6%2C%22qty_promo_bought%22%3A0%2C%22trans_limit%22%3A0%2C%22trans_live%22%3A0%2C%22manufacturers_id%22%3A0%2C%22parent_id%22%3A0%2C%22products_description%22%3A%22PROMO%20APRIL%20MURAH%21%5Cu003cbr%5Cu003e%5Cr%5CnRekomendasi%20harga%20jual%20warung%20Rp%203.500%2Fbotol%5Cu003cbr%5Cu003e%5Cr%5CnUntung%20Rp%201.300%20%2859%25%29%5Cu003cbr%5Cu003e%5Cr%5CnPembelian%20min%206%20botol%2C%20maks%2012%20botol%22%2C%22final_price%22%3A%222200.0%22%2C%22products_id%22%3A140%2C%22products_image%22%3A%22resources%2Fassets%2Fimages%2Fproduct_images%2F1555722212.promo-larutan-kakitiga.jpg%22%2C%22products_liked%22%3A0%2C%22products_model%22%3A%22%22%2C%22products_name%22%3A%22PROMO%20Cap%20Kaki%20Tiga%20Botol%20200%20ml%22%2C%22products_ordered%22%3A0%2C%22products_price%22%3A%222200.0%22%2C%22products_quantity%22%3A1%2C%22products_status%22%3A0%2C%22products_tax_class_id%22%3A0%2C%22products_viewed%22%3A0%2C%22products_weight%22%3A%221%22%2C%22products_weight_unit%22%3A%22Btl%22%2C%22sort_order%22%3A0%2C%22tax_class_id%22%3A0%2C%22tax_priority%22%3A0%2C%22tax_rates_id%22%3A0%2C%22tax_zone_id%22%3A0%2C%22total_price%22%3A%2213200.0%22%7D%2C%22customers_basket_product_attributes%22%3A%5B%5D%2C%22customers_id%22%3A0%7D%5D&status=0
that JSON string is generated from
new Gson().toJson(cartItemsList)
and that cartItemsList is an instance of class CartProduct
public class CartProduct {
#SerializedName("customers_id")
#Expose
private int customersId;
#SerializedName("customers_basket_id")
#Expose
private int customersBasketId;
#SerializedName("customers_basket_date_added")
#Expose
private String customersBasketDateAdded;
#SerializedName("customers_basket_product")
#Expose
private ProductDetails customersBasketProduct;
#SerializedName("customers_basket_product_attributes")
#Expose
private List<CartProductAttributes> customersBasketProductAttributes = new ArrayList<CartProductAttributes>();
public int getCustomersId() {
return customersId;
}
public void setCustomersId(int customersId) {
this.customersId = customersId;
}
public int getCustomersBasketId() {
return customersBasketId;
}
public void setCustomersBasketId(int customersBasketId) {
this.customersBasketId = customersBasketId;
}
public String getCustomersBasketDateAdded() {
return customersBasketDateAdded;
}
public void setCustomersBasketDateAdded(String customersBasketDateAdded) {
this.customersBasketDateAdded = customersBasketDateAdded;
}
public ProductDetails getCustomersBasketProduct() {
return customersBasketProduct;
}
public void setCustomersBasketProduct(ProductDetails customersBasketProduct) {
this.customersBasketProduct = customersBasketProduct;
}
public List<CartProductAttributes> getCustomersBasketProductAttributes() {
return customersBasketProductAttributes;
}
public void setCustomersBasketProductAttributes(List<CartProductAttributes> customersBasketProductAttributes) {
this.customersBasketProductAttributes = customersBasketProductAttributes;
}
}
and the class CartProductAttributes
public class CartProductAttributes implements Parcelable {
#SerializedName("customers_basket_id")
#Expose
private int customersBasketId;
#SerializedName("products_id")
#Expose
private String productsId;
#SerializedName("option")
#Expose
private Option option;
#SerializedName("values")
#Expose
private List<Value> values = new ArrayList<Value>();
public CartProductAttributes() {
}
public int getCustomersBasketId() {
return customersBasketId;
}
public void setCustomersBasketId(int customersBasketId) {
this.customersBasketId = customersBasketId;
}
public String getProductsId() {
return productsId;
}
public void setProductsId(String productsId) {
this.productsId = productsId;
}
/**
*
* #return
* The option
*/
public Option getOption() {
return option;
}
/**
*
* #param option
* The option
*/
public void setOption(Option option) {
this.option = option;
}
/**
*
* #return
* The values
*/
public List<Value> getValues() {
return values;
}
/**
*
* #param values
* The values
*/
public void setValues(List<Value> values) {
this.values = values;
}
//********** Describes the kinds of Special Objects contained in this Parcelable Instance's marshaled representation *********//
#Override
public int describeContents() {
return 0;
}
//********** Writes the values to the Parcel *********//
public void writeToParcel(Parcel parcel_out, int flags) {
parcel_out.writeValue(customersBasketId);
parcel_out.writeValue(productsId);
parcel_out.writeParcelable(option, flags);
parcel_out.writeList(values);
}
//********** Generates Instances of Parcelable class from a Parcel *********//
public static final Creator<CartProductAttributes> CREATOR = new Creator<CartProductAttributes>() {
// Creates a new Instance of the Parcelable class, Instantiating it from the given Parcel
#Override
public CartProductAttributes createFromParcel(Parcel parcel_in) {
return new CartProductAttributes(parcel_in);
}
// Creates a new array of the Parcelable class
#Override
public CartProductAttributes[] newArray(int size) {
return new CartProductAttributes[size];
}
};
//********** Retrieves the values from the Parcel *********//
protected CartProductAttributes(Parcel parcel_in) {
this.customersBasketId = parcel_in.readInt();
this.productsId = parcel_in.readString();
this.option = parcel_in.readParcelable(Option.class.getClassLoader());
this.values = new ArrayList<Value>();
parcel_in.readList(values, Value.class.getClassLoader());
}
}
and here is the ProductDetails class
public class ProductDetails implements Parcelable {
#SerializedName("products_id")
#Expose
private int productsId;
#SerializedName("products_quantity")
#Expose
private int productsQuantity;
#SerializedName("products_model")
#Expose
private String productsModel;
#SerializedName("products_image")
#Expose
private String productsImage;
#SerializedName("products_price")
#Expose
private String productsPrice;
#SerializedName("discount_price")
#Expose
private String discountPrice;
#SerializedName("products_date_added")
#Expose
private String productsDateAdded;
#SerializedName("products_last_modified")
#Expose
private String productsLastModified;
#SerializedName("products_date_available")
#Expose
private String productsDateAvailable;
#SerializedName("products_weight")
#Expose
private String productsWeight;
#SerializedName("products_weight_unit")
#Expose
private String productsWeightUnit;
#SerializedName("products_status")
#Expose
private int productsStatus;
#SerializedName("products_ordered")
#Expose
private int productsOrdered;
#SerializedName("products_liked")
#Expose
private int productsLiked;
#SerializedName("language_id")
#Expose
private int languageId;
#SerializedName("products_name")
#Expose
private String productsName;
#SerializedName("products_description")
#Expose
private String productsDescription;
#SerializedName("products_url")
#Expose
private String productsUrl;
#SerializedName("products_viewed")
#Expose
private int productsViewed;
#SerializedName("products_tax_class_id")
#Expose
private int productsTaxClassId;
#SerializedName("tax_rates_id")
#Expose
private int taxRatesId;
#SerializedName("tax_zone_id")
#Expose
private int taxZoneId;
#SerializedName("tax_class_id")
#Expose
private int taxClassId;
#SerializedName("tax_priority")
#Expose
private int taxPriority;
#SerializedName("tax_rate")
#Expose
private String taxRate;
#SerializedName("tax_description")
#Expose
private String taxDescription;
#SerializedName("tax_class_title")
#Expose
private String taxClassTitle;
#SerializedName("tax_class_description")
#Expose
private String taxClassDescription;
#SerializedName("categories_id")
#Expose
private int categoriesId;
#SerializedName("categories_name")
#Expose
private String categoriesName;
#SerializedName("categories_image")
#Expose
private String categoriesImage;
#SerializedName("categories_icon")
#Expose
private String categoriesIcon;
#SerializedName("parent_id")
#Expose
private int parentId;
#SerializedName("sort_order")
#Expose
private int sortOrder;
#SerializedName("isLiked")
#Expose
private String isLiked;
#SerializedName("manufacturers_id")
#Expose
private int manufacturersId;
#SerializedName("manufacturers_name")
#Expose
private String manufacturersName;
#SerializedName("manufacturers_image")
#Expose
private String manufacturersImage;
#SerializedName("manufacturers_url")
#Expose
private String manufacturersUrl;
#SerializedName("date_added")
#Expose
private String dateAdded;
#SerializedName("last_modified")
#Expose
private String lastModified;
#SerializedName("isSale_product")
#Expose
private String isSaleProduct;
#SerializedName("attributes_price")
#Expose
private String attributesPrice;
#SerializedName("final_price")
#Expose
private String productsFinalPrice;
#SerializedName("total_price")
#Expose
private String totalPrice = "";
#SerializedName("customers_basket_quantity")
#Expose
private int customersBasketQuantity;
#SerializedName("images")
#Expose
private List<Image> images = new ArrayList<Image>();
#SerializedName("attributes")
#Expose
private List<Attribute> attributes = new ArrayList<Attribute>();
#SerializedName("motorist_id")
#Expose
private long mMotoristId = 0;
#SerializedName("motorist_name")
#Expose
private String mMotoristName = "";
#SerializedName("qty_orders_min")
#Expose
private int mQuantityMin = 0;
#SerializedName("qty_orders_max")
#Expose
private int mQuantityMax = 0;
#SerializedName("id_jenis_products")
#Expose
private int mProductType = 0;
#SerializedName("trans_limit")
#Expose
private int mQuantityPromoLimit = 0;
#SerializedName("trans_live")
#Expose
private int mQuantityPromoLive = 0;
#SerializedName("qty_promo_bought")
#Expose
private int mQuantityPromoBought = 0;
#Override
public String toString() {
StringBuilder tempToString = new StringBuilder("\n--- ProductDetails ---\n");
tempToString.append("productsId: ").append(productsId).append("\n");
tempToString.append("productsName: ").append(productsName).append("\n");
tempToString.append("categoriesId: ").append(categoriesId).append("\n");
tempToString.append("categoriesName: ").append(categoriesName).append("\n");
tempToString.append("productsQuantity: ").append(productsQuantity).append("\n");
tempToString.append("productsDateAdded: ").append(productsDateAdded).append("\n");
tempToString.append("totalPrice: ").append(totalPrice).append("\n");
tempToString.append("minQuantity: ").append(mQuantityMin).append("\n");
tempToString.append("maxQuantity: ").append(mQuantityMax).append("\n");
tempToString.append("mProductType: ").append(mProductType).append("\n");
tempToString.append("mQuantityPromoLimit: ").append(mQuantityPromoLimit).append("\n");
tempToString.append("mQuantityPromoLive: ").append(mQuantityPromoLive).append("\n");
tempToString.append("mQuantityPromoBought: ").append(mQuantityPromoBought).append("\n");
return tempToString.toString();
}
}
and I want to convert that string JSON to be real JSON, for example like this:
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}
so I can read and replicate that JSON, and send it as JSON string from my iOS device to server using swift programming language. because I need to post that JSON string in the request body like this:
I get this JSON string from our android developer. this JSON string is generated from GSON library in Android, and it converts from Java Object to JSON string like that. unfortunately the android developer is also not understand how to convert it to real JSON, not JSON string.
I was Passing a this JSON http://www.mocky.io/v2/5cacde192f000078003a93bb
i was trying to print a just a category_name
I'm not able to get the data list , when i pass the object with out the data list just like http://www.mocky.io/v2/5cb859344c0000092ed3d4df
private Category_name category_name;
public Category_name getCategoryName() {
return category_name;
}
}
public class Category_name {
#SerializedName("category_name")
public String name;
public String getName() {
return name;
}
}````
i can access that through the NewAdapter.java
with the following code
#Override
public void onBindViewHolder(NewsViewHolder holder, int position) {
Log.e("Its coming","NewAdapter");
ApiObject apiObject = apiObjectList.get(position);
holder.title.setText(apiObject.getCategoryName().getName());
}
with the same code I'm not able to get the data list
#SerializedName("data")
public List<Data> data;
public List<Data> getData() {
return data;
}
public class Data {
#SerializedName("details")
private Category_name category_name;
public Category_name getCategoryName() {
return category_name;
}
}
public class Category_name {
#SerializedName("category_name")
public String name;
public String getName() {
return name;
}
}
#Override
public void onBindViewHolder(NewsViewHolder holder, int position) {
Log.e("Its coming","NewAdapter");
ApiObject apiObject = apiObjectList.get(position);
holder.title.setText(apiObject.getData().getCategoryName().getName());
}
I'm not able to access the getCategoryName();
Please help thanks in advance
use json 2 pojo conversion to create proper model class of json data
http://www.jsonschema2pojo.org/
pass whole example object to adapter constructer.
I think you need to follow these way of POJO parsing according to your JSON response.
public class Data{
#Serialization("status")
#Expose
private String status;
#Serialization("data")
#Expose
private List<MyData> data;
Then
public class MyData{
#Serialization("details")
#Expose
private List<Details> getDetails();
#Serialization("product_count")
#Expose
private String Product_count;
#Serialization("products")
#Expose
private List<Products> getProducts();
//setter and getters
}
Details POJO
Public class Details{
#Serialization("category_id")
#Expose
private String category_id;
#Serialization("category_name")
#Expose
private String category_name;
#Serialization("category_icon")
#Expose
private String category_icon;
//setter and getters
}
Products POJO
Public class Products{
#Serialization("product_id")
#Expose
private String product_id;
#Serialization("product_name")
#Expose
private String product_name;
#Serialization("product_image")
#Expose
private String product_icon;
etc
//setter and getters
}
I make request get photos from Flickr, using Retrofit 2.
I create a class for parsing it:
public class FlickrResult {
#SerializedName("photos")
#Expose
private FlickrPhotos photos;
#SerializedName("stat")
#Expose
private String stat;
public FlickrPhotos getPhotos() {
return photos;
}
public class FlickrPhotos {
#SerializedName("page")
#Expose
private int page;
#SerializedName("pages")
#Expose
private String pages;
#SerializedName("perpage")
#Expose
private int perpage;
#SerializedName("total")
#Expose
private String total;
#SerializedName("photo")
#Expose
private ArrayList<FlickrPhoto> photo;
public ArrayList<FlickrPhoto> getPhoto() {
return photo;
}
public class FlickrPhoto {
#SerializedName("id")
#Expose
private String id;
#SerializedName("owner")
#Expose
private String owner;
#SerializedName("secret")
#Expose
private String secret;
#SerializedName("server")
#Expose
private String server;
#SerializedName("farm")
#Expose
private int farm;
#SerializedName("title")
#Expose
private String title;
#SerializedName("ispublic")
#Expose
private int ispublic;
#SerializedName("isfriend")
#Expose
private int isfriend;
#SerializedName("isfamily")
#Expose
private int isfamily;
public String getTitle() {
return title;
}
}
}
}
My build request is:
static {
gson = new GsonBuilder()
.setLenient()
.create();
}
#NonNull
private static Retrofit buildRetrofit() {
Log.i(TAG, "onBuildRetrofitApiFactory");
return new Retrofit.Builder()
.baseUrl("https://api.flickr.com/services/")
.client(getClient())
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
Retrofit interface
#GET("rest")
Call<FlickrResult> getPhotos(#Query("method") String method,
#Query("api_key") String key,
#Query("format") String format,
#Query ("nojsoncallbac") String nojsoncallbac
);
Me responsable is success, but problem in parsing. Have exeption:
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
Please guys, i need you help!
Your Retrofit interface is wrong.
The paremeter "nojsoncallbac" is incorrect and should be "nojsoncallback".
This incorrect parameter causes the API to return a different format on the response
jsonFlickrApi({
"photos": {
"page": 1,
"pages": 10,
"perpage": 100,
"total": 1000,
"photo": [
...
]
}
})
Gson is expecting your JSON string to begin with an object opening brace
{
But the string you have passed to it may be starts with an open quotes
""