简体   繁体   中英

converting json with gson error Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

[{"user_id":"5633795","username":"_Vorago_","count300":"203483","count100":"16021","count50":"1517","playcount":"1634","ranked_score":"179618425","total_score":"1394180836","pp_rank":"34054","level":"59.6052","pp_raw":"1723.43","accuracy":"96.77945709228516","count_rank_ss":"1","count_rank_s":"19","count_rank_a":"17","country":"US","events":[]}]

I'm trying to convert the JSON above with GSON but am running into errors.

package com.grapefruitcode.osu;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

import com.google.gson.Gson;

public class Main {

static String ApiKey = "";
public static void main(String[]Args) throws Exception{
    String json = readUrl("");
    System.out.println(json);
    Gson gson = new Gson();
    User user = gson.fromJson(json, User.class);
    System.out.println();
}

private static String readUrl(String urlString) throws Exception {
    BufferedReader reader = null;
    try {
        URL url = new URL(urlString);
        reader = new BufferedReader(new InputStreamReader(url.openStream()));
        StringBuffer buffer = new StringBuffer();
        int read;
        char[] chars = new char[1024];
        while ((read = reader.read(chars)) != -1)
            buffer.append(chars, 0, read); 

        return buffer.toString();
    } finally {
        if (reader != null)
            reader.close();
    }
}

}

The url and api key are left blank for security reasons, the variables are filled when I run the code and the json is converted to a string properly. I've tested it already. If somebody could tell me what is causing the error that would be wonderful.

package com.grapefruitcode.osu;

public class User {
 String user_id = "";
 String username = "";
 String count300 = "";
 String count100= "";
}

In JSON

  • [ ... ] represents array
  • { ... } represents object,

so [ {...} ] is array containing one object. Try using

Gson gson = new Gson();
User[] users = gson.fromJson(json, User[].class);
System.out.println(Arrays.toString(users));
//or since we know which object from array we want to print
System.out.println(users[0]);

在此输入图像描述

Using RetroFit 2 Solution

        interface APIInterface {
            @POST("GetDataController/GetData")
            Call<GeoEvent> getGeofanceRecord(@Body GeoEvent geoEvent);   
        }

        APIInterface apiInterface;    // Declare Globally

        apiInterface = APIClient.getClient().create(APIInterface.class);

    final GeoEvent geoEvent = new GeoEvent(userId);

            Call<GeoEvent> call = apiInterface.getGeofanceRecord(geoEvent);

            call.enqueue(new Callback<GeoEvent>() {
                @Override
                public void onResponse(Call<GeoEvent> call, Response<GeoEvent> response) {
                    GeoEvent geoEvent1 = response.body();
    //              Log.e("keshav","Location -> " +geoEvent1.responseMessage);

                    List<GeoEvent.GeoEvents> geoEventsList = geoEvent1.Table;   // Array Naame

                    List<GeoEvent.GeoEvents> geoEventsArrayList = new ArrayList<GeoEvent.GeoEvents>();
                    geoEventsArrayList.addAll(geoEventsList);
                    for (GeoEvent.GeoEvents geoEvents : geoEventsList) {

                        Log.e("keshav", "Location -> " + geoEvents.Location);
                        Log.e("keshav", "DateTime -> " + geoEvents.DateTime);
                    }

                    if (geoEventsArrayList != null) {
                        adapter.clear();
                        adapter.addAll(geoEventsArrayList);
                        adapter.notifyDataSetChanged();
                    }
                }

                @Override
                public void onFailure(Call<GeoEvent> call, Throwable t) {
                    call.cancel();
                }
            });

Your Pojo Class Like This

package pojos;

import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;
import java.util.List;

public class GeoEvent {

    public String userId;

    public GeoEvent(String userId){
     this.userId= userId;
    }

    public List<GeoEvents> Table = new ArrayList<>();

    public class GeoEvents {

        @SerializedName("Location")
        public String Location;
        @SerializedName("DateTime")
        public String DateTime;

        public String getLocation() {
            return Location;
        }

        public void setLocation(String location) {
            Location = location;
        }

        public String getDateTime() {
            return DateTime;
        }

        public void setDateTime(String dateTime) {
            DateTime = dateTime;
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM