繁体   English   中英

Gson:预期为字符串,但在第 1 行第 3 列路径 $[0] 处为 BEGIN_OBJECT

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

我想从包含以下内容的字符串中获取 ArrayList:`

[
    {
        "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 编写自己的反序列化器,但没有任何效果。 我没主意了。

这就是你的 POJO Class 的样子,而不是枚举,它应该是普通的 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 + '\'' +
                    '}';
        }
    }

为了回答我已经从文件中使用了 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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