Gson: ожидалась строка, но она была BEGIN_OBJECT в строке 1, столбце 3, путь $ [0] - PullRequest
1 голос
/ 08 мая 2020

Я хочу получить ArrayList из String, содержащего: `

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

Однако каждый раз я получаю исключение JsonSyntaxException. Мой Permission.class выглядит так:

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

Я попытался десериализовать строку, используя:

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

Я также попытался добавить имя к этой строке или написать собственный десериализатор, используя Permission.getById, ничего не работает. У меня нет идей.

1 Ответ

0 голосов
/ 08 мая 2020

Вот как должен выглядеть ваш класс POJO вместо перечисления, он должен быть простым java класс

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 + '\'' +
                    '}';
        }
    }

Для ответа я использовал JsonReader из файла, вместо этого вы можете напрямую использовать строку в gson.fromJson(...) метод

Вот как я вызываю для преобразования массива строк в список разрешений

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...