小编典典

com.google.gson.JsonSyntaxException:应为BEGIN_ARRAY,但为STRING

java

我在解析json数据时遇到此错误:

 Expected BEGIN_ARRAY but was STRING at line 1 column 1156

我找不到解决方案。我的json数据是:

{
    "project": [
        {
            "abbreviation": "abd",
            "customer": "customer1",
            "description": "description1",
            "icon": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC4UlEQVR42sXTXUhTYRgH8NNNXkTdmPlRpltqalgXZlB4hCC6C8VyYjErtbCoNLJiqQmOtqmYCkUXdhNEGSHYuVXCj81N58dcO+rOPt3c2dnOWTubeSPUv6PZx1U3XfTAj4f3gf/zXL0E8d+LoqgEw+RkvnnOWmi22H6Ytx4bHRtLSt2XSKhUqr8vkMKFYS5I8y5LhGemBYEx8xHPp3CICxpoevFcf3//LrVanaDRaBK0Wu0WnU632XdK8x3E1MxcSZR1Cez7ewgM1IEdqEWYasW6yCMajQqBQGDE5/N98Hq9lNvtppxOJ8UwDEXT9LuJiYmThMlkIuMxUVgXQ1KIw5doEGufOcRjMYiiiEgkAp7nwXEcWJaF3+/HysoKnC7XxtTUdA1hNBrJzUvx+Bpi8Thisbh0+XcwFAohyIUQYANS0A2P2wGXyw6GWdyYMo7VEXq9nuR5QSpeCnDgw0GEQ6x0MQA24MeqzwPvwhiWXzeD7q6CrecibL2XYO2s+DrzoGCEGNcbilmfk3e8fYSlXiWWn13F8vMaLD27gsU+JWydFbDcLcRsVTJmFEmYqdym2AuzcreDGNWbij02A79w/wTmlOmYqz74y6zypwzMVmdi9vIfqjNgrk0cJz5OmIoZI8Vb7kkLruVK8rblbpm/dhjz1yX1ObBsuvHD5tt8K3WQGB43FtPDr3hLYxEW6o/CWl8A280jWLydh+XGHDBNWXA+lMOpksHVnAlnSyYcrTLYW+SwtqS9kBZMkrahPoG+Uwh7w1G4m/LgV2Uh2CZDWJ0BQZOOSMd+RDpTIXSlgJdwnWlY7TjwjdGmtRFvBoeK9C9b7fMNx2J0U67oeHRI9D6WiavtcjH4JEvktBKdXJIusrpU0a9NFj2aFNHefiBsUGVcJk6fObunqbq0SF2aX6IpyyY7yrPIrvPZZHdFDtmjyCV7K/O3+lOFNFPIya4KGdlxQUa2l8lPlR9PS/nnz/gdnPcTQcpv7vgAAAAASUVORK5CYII=",
            "name": "projectname1",
            "plannedEndDate": "2012-05-25T00:00:00+01:00",
            "plannedStartDate": "2012-05-23T00:00:00+01:00",
            "projectStatus": {
                "name": "Opened"
            },
            "realEndDate": "2012-05-25T00:00:00+01:00",
            "realStartDate": "2012-05-23T00:00:00+01:00"
        }
    ]
}

我将图像转换为字节数组,如下所示:

public static byte[] convertToByteArray(String path) {  
        byte[] imageInByte = null;
        try{

            BufferedImage originalImage = 
                                      ImageIO.read(new File(path));

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write( originalImage, "png", baos );
            baos.flush();
            imageInByte = baos.toByteArray();

            baos.close();

            }catch(IOException e){
                System.out.println(e.getMessage());
            }
        return imageInByte;
    }

我正在将图标从字节数组转换为Bitmap,如下所示:

Bitmap bm = BitmapFactory.decodeByteArray(project.getIcon(), 0,
        project.getIcon().length);
DisplayMetrics dm = new DisplayMetrics();

holder.imageProjet.setMinimumHeight(dm.heightPixels);
holder.imageProjet.setMinimumWidth(dm.widthPixels);
holder.imageProjet.setImageBitmap(bm);

我反序列化JSON响应的代码:

Gson gson = new GsonBuilder().setDateFormat(
                "yyyy-MM-dd'T'HH:mm:ssZ").create();

        final ProjectContainer container = gson.fromJson(resultat,
                ProjectContainer.class);
        final ListView lv = (ListView) findViewById(R.id.list);

        /**
         * Updating parsed JSON data into ListView
         * */
        adaptateur = new ProjectAdapter(ProjectActivity.this,
                R.layout.ligne_project, container);

这是我的ProjectContainer类:

  public class ProjectContainer {
        @SerializedName("project")
        List<Project> projects ;

        public List<Project> getProjects() {
            return projects;
        }

        public void setProjects(List<Project> projects) {
            this.projects = projects;
        }
    }

这是Project类:

public class Project implements Serializable {

    private static final long serialVersionUID = 1L;
    @SerializedName("projectStatus")
    private ProjectStatus projectStatus;
    @SerializedName("name")
    private String name;
    @SerializedName("description")
    private String description;
    @SerializedName("abbreviation")
    private String abbreviation;
    @SerializedName("customer")
    private String customer;
    @SerializedName("plannedStartDate")
    private Date plannedStartDate;
    @SerializedName("plannedEndDate")
    private Date plannedEndDate;
    @SerializedName("realStartDate")
    private Date realStartDate;
    @SerializedName("realEndDate")
    private Date realEndDate;
    @SerializedName("isDeleted")
    private Boolean isDeleted;
    @SerializedName("icon")
    private byte[] icon;


    public Project() {
    }

    public Project(String name, String description, String abbreviation,
            String customer, Date plannedStartDate, Date plannedEndDate,
            ProjectStatus projectStatus, Date realStartDate, Date realEndDate) {
        this.name = name;
        this.description = description;
        this.abbreviation = abbreviation;
        this.plannedStartDate = plannedStartDate;
        this.plannedEndDate = plannedEndDate;
        this.projectStatus = projectStatus;
        this.realStartDate = realStartDate;
        this.realEndDate = realEndDate;
        this.customer = customer;

    }

    public String toString() {
        return name;
    }

    public ProjectStatus getProjectStatus() {
        return this.projectStatus;
    }

    public void setProjectStatus(ProjectStatus projectStatus) {
        this.projectStatus = projectStatus;
    }

    public String getName() {
        return this.name;
    }

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

    public String getDescription() {
        return this.description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getAbbreviation() {
        return this.abbreviation;
    }

    public void setAbbreviation(String abbreviation) {
        this.abbreviation = abbreviation;
    }

    public Date getPlannedStartDate() {
        return this.plannedStartDate;
    }

    public void setPlannedStartDate(Date plannedStartDate) {
        this.plannedStartDate = plannedStartDate;
    }

    public Date getPlannedEndDate() {
        return this.plannedEndDate;
    }

    public void setPlannedEndDate(Date plannedEndDate) {
        this.plannedEndDate = plannedEndDate;
    }

    public Date getRealStartDate() {
        return this.realStartDate;
    }

    public void setRealStartDate(Date realStartDate) {
        this.realStartDate = realStartDate;
    }

    public Date getRealEndDate() {
        return this.realEndDate;
    }

    public void setRealEndDate(Date realEndDate) {
        this.realEndDate = realEndDate;
    }


    public byte[] getIcon() {
        return this.icon;
    }

    public void setIcon(byte[] icon) {
        this.icon = icon;
    }

    public String getCustomer() {
        return this.customer;
    }
    public void setCustomer(String customer) {
        this.customer= customer;
    }
}

如果您能帮助我解决这个问题,我将不胜感激。提前致谢


阅读 235

收藏
2020-11-26

共1个答案

小编典典

当您尝试解析该字段时会引发Exception "icon",因为在JSON响应中有一个字符串,并且您尝试将其解析为byte[]

由于在您的类中icon是一个字节数组,因此当它尝试解析该字段时"icon"会说“ 期望一个数组
”,但是在JSON响应"icon"中不是数组(没有被包围[ ]),因此它说“ 但是是一个字符串 “ …


编辑
:这就是说,为了解决这个问题,在我看来,最简单的方法是改变类型iconString正确解析,然后进行转换到byte[]别的地方…例如,你可以在一个方法假设类public byte[] getIconAsByteArray() {...}进行转换。

否则,这可能是最 优雅的 解决方案,您需要编写一个
自定义解串器

2020-11-26