0

EDIT: My bad, I was creating a List of wrong object.


I'm trying to deserialize a JSON in Java that I can see correctly. But using Gson.fromJson(), all attributes become 0 or null.

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

}

Here I'm trying to parse JSON

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

I can correctly print my jsonOutput and see my JSON output:

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

but when i'ts converted in Gson

Type listType = new TypeToken<List<Group>>(){}.getType();
List<Group> list = new ArrayList<Group>();
list = gson.fromJson(jsonOutput, listType);

Each field of Group in list is 0 or null, so I can't use this list, why?

  • Hi, Wellcome to SO, please read this link. https://stackoverflow.com/questions/5314813/json-gson-fromjson-java-objects – aironman Aug 31 '20 at 18:46

2 Answers2

0

No deserializing way

First of all, the class Group have neither no-args-constructor nor InstanceCreator defined. GSON can not correctly instantiate the Group, so it uses the UnsafeAllocator, which allocates the empty instance. (source)

Mismatching DTO

Then, even the GSON succeeds the instantiating the instance, your incoming JSON has no fields in common with Group class. The Group class has fields named

boardId, chat, created_on, invites, members, members_num, name, posts, postsNum

but incoming JSON obkects have fields named

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

Then, the GSON foes not find any matches in names, then all fields of Group are null or 0

Vladimir Shefer
  • 661
  • 3
  • 19
0

The problem is that you think your data is a list of groups. But it isn't! Your data is a list of objects that each have a group.

if you replace this:

Type listType = new TypeToken<List<Group>>(){}.getType();
List<Group> list = new ArrayList<Group>();
list = gson.fromJson(jsonOutput, listType);

by this:

Type listType = new TypeToken<List<GroupWrapper>>(){}.getType();
List<GroupWrapper> list = new ArrayList<>();
list = new Gson().fromJson(jsonOutput, listType);

using a class similar to this:

class GroupWrapper {
    Group group;
}

then you will have values inside your groups.

If you only want a List then you can do something like this:

List<Group> groupList = list.stream()
            .map(groupWrapper -> groupWrapper.group)
            .collect(Collectors.toList());
Léo Schneider
  • 2,085
  • 3
  • 15
  • 28