简体   繁体   中英

Gson: Expected a string but was BEGIN_OBJECT at line 1 column 3 path $[0]

I want to get an ArrayList out of a String containing:`

[
    {
        "name": "*",
        "package": "permission",
        "id": "permission.*"
    },
    {
        "name": "*",
        "package": "info",
        "id": "info.*"
    },
    {
        "name": "help",
        "package": "info",
        "id": "info.help"
    },
    {
        "name": "ping",
        "package": "info",
        "id": "info.ping"
    },
    {
        "name": "premium",
        "package": "info",
        "id": "info.premium"
    }
]

However, I get a JsonSyntaxException every time. My Permission.class looks like this:

public enum Permission {
    ALL("permission", "*"),

    INFO("info", "*"),
    INFO_HELP("info", "help"),
    INFO_PING("info", "ping"),
    INFO_PREMIUM("info", "premium"),

    ;
    @SerializedName("permPack")
    public final String permPack;
    @SerializedName("permName")
    public final String permName;
    @SerializedName("permId")
    public final String id;

    Permission(String permPack, String name) {
        this.permPack = permPack;
        this.permName = name;
        this.id = permPack + "." + name;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return permName;
    }

    public String getPermPack() {
        return permPack;
    }

    public static Permission getById(String Id) {
        List<Permission> perms = Arrays.asList(Permission.values());
        for (int i = 0; i < perms.size(); i++) {
            if (perms.get(i).getId().equals(Id)){
                return perms.get(i);
            }
        }
        return null;
    }
}

I tried to deserialize the String using:

    Type listType = new TypeToken<ArrayList<Permission>>(){}.getType();
    ArrayList<Permission> availablePermsList = gson.fromJson(permissionString, listType);

I also tried to add a name to this String or writing an own deserializer using Permission.getById, nothing works. I am out of ideas.

This is how your POJO Class should look like instead of enum it should be plain java class

class Permission {
        private String id;
        private String name;
        @SerializedName("package")
        private String packageName;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getPackageName() {
            return packageName;
        }

        public void setPackageName(String packageName) {
            this.packageName = packageName;
        }

        @Override
        public String toString() {
            return "Permission{" +
                    "id='" + id + '\'' +
                    ", name='" + name + '\'' +
                    ", packageName='" + packageName + '\'' +
                    '}';
        }
    }

For answering i have used JsonReader from a file, instead you can directly use string in gson.fromJson(...) method

This is how i am calling to convert Array of string to Permission List

Type permissionsListType = new TypeToken<ArrayList<Permission>>(){}.getType();
JsonReader jsonReader = new JsonReader(new FileReader(new File("permissions.json")));
Gson gson = new Gson();
ArrayList<Permission> availablePermsList = gson.fromJson(jsonReader, permissionsListType);

System.out.println(availablePermsList);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM