簡體   English   中英

Gson.fromJSON 返回 0 和 null

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

listGroup每個字段都是0或null,所以我不能使用這個列表,為什么?

沒有反序列化的方式

首先,類Group既沒有定義 no-args-constructor 也沒有InstanceCreator定義。 GSON 無法正確實例化Group ,因此它使用UnsafeAllocator來分配空實例。 來源

不匹配的 DTO

然后,即使 GSON 成功實例化實例,您傳入的 JSON 也沒有與Group類相同的字段。 Group類具有名為的字段

boardIdchatcreated_oninvitesmembersmembers_numnamepostspostsNum

但傳入的 JSON 對象具有名為的字段

group , group_id , is_owner , join_date , last_chat_read , user , user_id

然后,GSON 敵人在名稱中找不到任何匹配項,則Group所有字段都為null0

問題是您認為您的數據是一組組列表。 但事實並非如此! 您的數據是一個對象列表,每個對象都有一個組。

如果你替換這個:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM