[英]Gson.fromJSON returns 0 and null
編輯:我的錯,我正在創建一個錯誤對象的列表。
我正在嘗試在 Java 中反序列化我可以正確看到的 JSON。 但是使用 Gson.fromJson(),所有屬性都變為 0 或 null。
組.java
public class Group extends Board {
private String created_on;
private ArrayList<GroupMember> members;
private ArrayList<GroupChat> chat;
private ArrayList<GroupInvite> invites;
private int members_num;
public Group(int id,
String name,
ArrayList<Post> posts,
int posts_num,
String created_on,
ArrayList<GroupMember> members,
ArrayList<GroupChat> chat,
ArrayList<GroupInvite> invites,
int members_num) {
super(id, name, "group", posts, posts_num);
this.members = members;
this.chat = chat;
this.invites = invites;
this.members_num = members_num;
this.created_on = created_on;
}
public int getId(){ return super.getBoardId(); }
public String getName(){ return super.getName(); }
public String getCreatedOn(){ return created_on; }
public int getPostsNum(){ return super.getPostsNum(); }
public ArrayList<Post> getPosts(){ return super.getPosts(); }
public ArrayList<GroupMember> getMembers(){ return members; }
public ArrayList<GroupInvite> getInvites(){ return invites; }
}
在這里,我正在嘗試解析 JSON
組請求.java
public ObservableList<Group> getUserGroups() throws IOException, InterruptedException {
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(URI.create("http://localhost:8000/groups/"))
.setHeader("authorization", Auth.getInstance().getToken())
.build();
HttpResponse<String> response = ApiClient.getInstance().getHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
Gson gson = new Gson();
String jsonOutput = response.body();
System.out.println(response.body());
Type listType = new TypeToken<List<Group>>(){}.getType();
List<Group> list = new ArrayList<Group>();
list = gson.fromJson(jsonOutput, listType);
ObservableList<Group> groups = FXCollections.observableList(list);
return groups;
}
我可以正確打印我的jsonOutput
並查看我的 JSON 輸出:
[
{
"user_id":"AnvediFratello",
"group_id":11,
"join_date":"2020-08-31T14:34:20",
"last_chat_read":"2020-08-31T14:34:20",
"is_owner":true,
"user":{
"id":"AnvediFratello",
"display_name":null,
"registered_on":"2020-08-29T11:14:36"
},
"group":{
"id":11,
"name":"asd",
"type":"group",
"created_on":"2020-08-31T14:34:20",
"members_num":1
}
},
{
"user_id":"AnvediFratello",
"group_id":12,
"join_date":"2020-08-31T14:46:43",
"last_chat_read":"2020-08-31T14:46:43",
"is_owner":true,
"user":{
"id":"AnvediFratello",
"display_name":null,
"registered_on":"2020-08-29T11:14:36"
},
"group":{
"id":12,
"name":"test",
"type":"group",
"created_on":"2020-08-31T14:46:43",
"members_num":1
}
},
{
"user_id":"AnvediFratello",
"group_id":13,
"join_date":"2020-08-31T14:49:07",
"last_chat_read":"2020-08-31T14:49:07",
"is_owner":true,
"user":{
"id":"AnvediFratello",
"display_name":null,
"registered_on":"2020-08-29T11:14:36"
},
"group":{
"id":13,
"name":"f",
"type":"group",
"created_on":"2020-08-31T14:49:07",
"members_num":1
}
},
{
"user_id":"AnvediFratello",
"group_id":14,
"join_date":"2020-08-31T14:50:39",
"last_chat_read":"2020-08-31T14:50:39",
"is_owner":true,
"user":{
"id":"AnvediFratello",
"display_name":null,
"registered_on":"2020-08-29T11:14:36"
},
"group":{
"id":14,
"name":"nuovo",
"type":"group",
"created_on":"2020-08-31T14:50:39",
"members_num":1
}
},
{
"user_id":"AnvediFratello",
"group_id":15,
"join_date":"2020-08-31T14:51:18",
"last_chat_read":"2020-08-31T14:51:18",
"is_owner":true,
"user":{
"id":"AnvediFratello",
"display_name":null,
"registered_on":"2020-08-29T11:14:36"
},
"group":{
"id":15,
"name":"ggg",
"type":"group",
"created_on":"2020-08-31T14:51:18",
"members_num":1
}
},
{
"user_id":"AnvediFratello",
"group_id":16,
"join_date":"2020-08-31T14:51:47",
"last_chat_read":"2020-08-31T14:51:47",
"is_owner":true,
"user":{
"id":"AnvediFratello",
"display_name":null,
"registered_on":"2020-08-29T11:14:36"
},
"group":{
"id":16,
"name":"ff",
"type":"group",
"created_on":"2020-08-31T14:51:47",
"members_num":1
}
},
{
"user_id":"AnvediFratello",
"group_id":17,
"join_date":"2020-08-31T14:53:46",
"last_chat_read":"2020-08-31T14:53:46",
"is_owner":true,
"user":{
"id":"AnvediFratello",
"display_name":null,
"registered_on":"2020-08-29T11:14:36"
},
"group":{
"id":17,
"name":"dded",
"type":"group",
"created_on":"2020-08-31T14:53:46",
"members_num":1
}
},
{
"user_id":"AnvediFratello",
"group_id":18,
"join_date":"2020-08-31T14:57:07",
"last_chat_read":"2020-08-31T14:57:07",
"is_owner":true,
"user":{
"id":"AnvediFratello",
"display_name":null,
"registered_on":"2020-08-29T11:14:36"
},
"group":{
"id":18,
"name":"dedddd",
"type":"group",
"created_on":"2020-08-31T14:57:07",
"members_num":1
}
},
{
"user_id":"AnvediFratello",
"group_id":19,
"join_date":"2020-08-31T14:58:02",
"last_chat_read":"2020-08-31T14:58:02",
"is_owner":true,
"user":{
"id":"AnvediFratello",
"display_name":null,
"registered_on":"2020-08-29T11:14:36"
},
"group":{
"id":19,
"name":"sdas",
"type":"group",
"created_on":"2020-08-31T14:58:02",
"members_num":1
}
},
{
"user_id":"AnvediFratello",
"group_id":20,
"join_date":"2020-08-31T14:58:48",
"last_chat_read":"2020-08-31T14:58:48",
"is_owner":true,
"user":{
"id":"AnvediFratello",
"display_name":null,
"registered_on":"2020-08-29T11:14:36"
},
"group":{
"id":20,
"name":"slowmo",
"type":"group",
"created_on":"2020-08-31T14:58:48",
"members_num":1
}
},
{
"user_id":"AnvediFratello",
"group_id":21,
"join_date":"2020-08-31T15:00:47",
"last_chat_read":"2020-08-31T15:00:47",
"is_owner":true,
"user":{
"id":"AnvediFratello",
"display_name":null,
"registered_on":"2020-08-29T11:14:36"
},
"group":{
"id":21,
"name":"miogruppo",
"type":"group",
"created_on":"2020-08-31T15:00:47",
"members_num":1
}
},
{
"user_id":"AnvediFratello",
"group_id":22,
"join_date":"2020-08-31T15:02:18",
"last_chat_read":"2020-08-31T15:02:18",
"is_owner":true,
"user":{
"id":"AnvediFratello",
"display_name":null,
"registered_on":"2020-08-29T11:14:36"
},
"group":{
"id":22,
"name":"f",
"type":"group",
"created_on":"2020-08-31T15:02:18",
"members_num":1
}
},
{
"user_id":"AnvediFratello",
"group_id":23,
"join_date":"2020-08-31T15:45:34",
"last_chat_read":"2020-08-31T15:45:34",
"is_owner":true,
"user":{
"id":"AnvediFratello",
"display_name":null,
"registered_on":"2020-08-29T11:14:36"
},
"group":{
"id":23,
"name":"ohgno",
"type":"group",
"created_on":"2020-08-31T15:45:34",
"members_num":1
}
},
{
"user_id":"AnvediFratello",
"group_id":24,
"join_date":"2020-08-31T15:45:36",
"last_chat_read":"2020-08-31T15:45:36",
"is_owner":true,
"user":{
"id":"AnvediFratello",
"display_name":null,
"registered_on":"2020-08-29T11:14:36"
},
"group":{
"id":24,
"name":"ohgno",
"type":"group",
"created_on":"2020-08-31T15:45:36",
"members_num":1
}
}
]
但是當我在 Gson 中轉換時
Type listType = new TypeToken<List<Group>>(){}.getType();
List<Group> list = new ArrayList<Group>();
list = gson.fromJson(jsonOutput, listType);
list
中Group
每個字段都是0或null,所以我不能使用這個列表,為什么?
首先,類Group
既沒有定義 no-args-constructor 也沒有InstanceCreator
定義。 GSON 無法正確實例化Group
,因此它使用UnsafeAllocator
來分配空實例。 (來源)
然后,即使 GSON 成功實例化實例,您傳入的 JSON 也沒有與Group
類相同的字段。 Group
類具有名為的字段
boardId
、 chat
、 created_on
、 invites
、 members
、 members_num
、 name
、 posts
、 postsNum
但傳入的 JSON 對象具有名為的字段
group
, group_id
, is_owner
, join_date
, last_chat_read
, user
, user_id
然后,GSON 敵人在名稱中找不到任何匹配項,則Group
所有字段都為null
或0
問題是您認為您的數據是一組組列表。 但事實並非如此! 您的數據是一個對象列表,每個對象都有一個組。
如果你替換這個:
Type listType = new TypeToken<List<Group>>(){}.getType();
List<Group> list = new ArrayList<Group>();
list = gson.fromJson(jsonOutput, listType);
這樣:
Type listType = new TypeToken<List<GroupWrapper>>(){}.getType();
List<GroupWrapper> list = new ArrayList<>();
list = new Gson().fromJson(jsonOutput, listType);
使用類似於此的類:
class GroupWrapper {
Group group;
}
那么你的組內就會有值。
如果您只想要一個列表,那么您可以執行以下操作:
List<Group> groupList = list.stream()
.map(groupWrapper -> groupWrapper.group)
.collect(Collectors.toList());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.