使用 gson 错误转换 json 预期 BEGIN_OBJECT 但在第 1 行第 2 列路径 $=BEGIN_ARRAY

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":[]}]

我正在尝试使用 GSON 转换上面的 JSON,但 运行 出错了。

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

}

为了安全起见,url和api键留空,变量在我运行代码和json转换成字符串的时候填入适当地。我已经测试过了。如果有人能告诉我是什么导致了错误,那就太好了。

package com.grapefruitcode.osu;

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

在JSON

  • [ ... ]表示数组
  • { ... }表示对象,

所以[ {...} ]是包含一个对象的数组。尝试使用

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]);

使用 RetroFit 2 解决方案

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

你的 Pojo Class 像这样

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;
        }
    }
}