com.google.gson.JsonSyntaxException: ожидалось BEGIN_ARRAY, но было STRING

Я сталкиваюсь с этой ошибкой при анализе данных 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 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;
        }
    }

и это класс проекта:

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

Буду очень признателен, если вы поможете мне решить эту проблему. заранее спасибо


person Wijden    schedule 15.05.2013    source источник
comment
опубликованный вами код не соответствует исключению, которое вы получаете   -  person Blackbelt    schedule 15.05.2013
comment
Кажется, что есть проблема при синтаксическом анализе с помощью Gson, можете ли вы предоставить код, в котором вы фактически десериализуете ответ JSON?   -  person MikO    schedule 15.05.2013
comment
Спасибо, я обновил свой вопрос   -  person Wijden    schedule 15.05.2013


Ответы (1)


Исключение возникает, когда вы пытаетесь проанализировать поле "icon", потому что в вашем ответе JSON есть строка, и вы пытаетесь проанализировать ее как byte[].

Поскольку в вашем классе icon представляет собой массив байтов, при попытке проанализировать поле "icon" он говорит, что "ожидается массив", но в ответе JSON "icon" не является массивом (ничего не окружено на [ ]), поэтому он говорит "но это была строка"...


EDIT: Тем не менее, чтобы исправить это, самый простой способ, на мой взгляд, - изменить тип icon на String, чтобы правильно его проанализировать, а затем выполнить преобразование в byte[] где-то еще.. Например, у вас может быть метод в классе, скажем, public byte[] getIconAsByteArray() {...}, который выполняет преобразование.

В противном случае, и это, вероятно, самое элегантное решение, вам нужно написать пользовательский десериализатор.

person MikO    schedule 15.05.2013
comment
Да, хорошая идея, большое спасибо, я очень ценю вашу помощь, очень любезно с вашей стороны. - person Wijden; 15.05.2013