Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Expected a string but was BEGIN_ARRAY- Gson

Tags:

android

gson

Hi I am trying to parse Json from this api https://restcountries.eu. But when i trie to parse the topLevelDomain i ve got the error: "E/Error: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 1 column 42 path $[0].topLevelDomain" How can i fix it ? Thanks in advance

Below is Json structure, My Model , and MainActivity

Json structure

[{
"name": "Colombia",
"topLevelDomain": [".co"],
"alpha2Code": "CO",
"alpha3Code": "COL",
"callingCodes": ["57"],
"capital": "Bogotá",
"altSpellings": ["CO", "Republic of Colombia", "República de Colombia"],
"region": "Americas",
"subregion": "South America",
"population": 48759958,
"latlng": [4.0, -72.0],
"demonym": "Colombian",
"area": 1141748.0,
"gini": 55.9,
"timezones": ["UTC-05:00"],
"borders": ["BRA", "ECU", "PAN", "PER", "VEN"],
"nativeName": "Colombia",
"numericCode": "170",
"currencies": [{
    "code": "COP",
    "name": "Colombian peso",
    "symbol": "$"
}],

Model

public class ModelJsona {
private String flag;
private String name;
private String region;
private String topLevelDomain;


public String getFlag() {
    return flag;
}

public void setFlag(String flag) {
    this.flag = flag;
}


public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}



public String getRegion() {
    return region;
}

public void setRegion(String region) {
    this.region = region;
}


public String getTopLevelDomain() {
    return topLevelDomain;
}

public void setTopLevelDomain(String region) {
    this.topLevelDomain = region;
}

}

MainActivity

public class MainActivity extends AppCompatActivity {

private RecyclerView recyclerView;
private DataAdapter dataAdapter;
private List<ModelJsona> dataArrayList;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initViews();




}


private void initViews(){
    recyclerView=(RecyclerView) findViewById(R.id.card_recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
    loadJSON();
}

private void loadJSON(){
    dataArrayList = new ArrayList<>();
    Retrofit retrofit=new Retrofit.Builder().baseUrl("https://restcountries.eu/").addConverterFactory(GsonConverterFactory.create()).build();
    RequestInterface requestInterface=retrofit.create(RequestInterface.class);
    Call<List<ModelJsona>> call= requestInterface.getJSON();
    call.enqueue(new Callback<List<ModelJsona>>() {
        @Override
        public void onResponse(Call<List<ModelJsona>> call, Response<List<ModelJsona>> response) {
            dataArrayList = response.body();
            dataAdapter=new DataAdapter(getApplicationContext(),dataArrayList);
            recyclerView.setAdapter(dataAdapter);
        }

        @Override
        public void onFailure(Call<List<ModelJsona>> call, Throwable t) {
            Log.e("Error",t.getMessage());
        }
    });
}
like image 940
Bart222 Avatar asked Sep 22 '26 10:09

Bart222


1 Answers

topLevelDomain is an array, not String. You should map it as so:

public class ModelJsona {
    private String flag;
    private String name;
    private String region;
    private List<String> topLevelDomain;
    ...
}

If you need it to be Serializable use ArrayList instead.

like image 119
Eduardo Herzer Avatar answered Sep 25 '26 02:09

Eduardo Herzer



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!