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

[{"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 getGeofanceRecord(@Body GeoEvent geoEvent); } APIInterface apiInterface; // Declare Globally apiInterface = APIClient.getClient().create(APIInterface.class); final GeoEvent geoEvent = new GeoEvent(userId); Call call = apiInterface.getGeofanceRecord(geoEvent); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { GeoEvent geoEvent1 = response.body(); // Log.e("keshav","Location -> " +geoEvent1.responseMessage); List geoEventsList = geoEvent1.Table; // Array Naame List geoEventsArrayList = new ArrayList(); 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 call, Throwable t) { call.cancel(); } }); 

你的Pojo类就像这样

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