本文介绍了com.google.gson.JsonSyntaxException:预期BEGIN_ARRAY但STRING的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我现在面临的解析JSON数据这个错误:

I am facing this error in parsing json data :

 Expected BEGIN_ARRAY but was STRING at line 1 column 1156

我could'nt找到解决方案。我的JSON数据是:

I could'nt find the solution. My json data is :

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

我将图像转换为字节数组是这样的:

I convert the image to byte array like this :

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

和我转换图标字节数组位图是这样的:

And I'm converting the icon from byte array to Bitmap like this :

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

在code,我反序列化JSON响应:

The code where I deserialize the JSON response :

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类:

This is my ProjectContainer class :

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

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

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

这是工程类:

and this is Project class :

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

我将不胜AP preciate如果你能帮助我解决这个问题。在此先感谢

I would greatly appreciate if you can help me solve this problem. Thanks in advance

推荐答案

当您尝试分析字段抛出异常选项,因为在你的JSON响应有一个字符串,并尝试分析它作为一个字节[]

The Exception is thrown when you try to parse the field "icon", because in your JSON response there is a string, and you try to parse it as a byte[].

由于你的类,图标是一个字节数组,当它试图分析字段选项它说,它的预计数组的,但在JSON响应选项不是数组(没有什么用<$ C包围$ C> [] ),所以说的但字符串的......

Since in your class, icon is an array of bytes, when it tries to parse the field "icon" it says it "expected an array", but in the JSON response "icon" is not an array (there's nothing surrounded by [ ]), so it says "but was a string"...

修改的:这就是说,为了解决这个问题,在我看来,最简单的方法是改变图标的类型为字符串正确解析,然后进行转换,以字节[] 别的地方...例如,你可以有在类中的方法,比方说公共字节[] getIconAsByteArray(){...} ,执行转换。

EDIT: That said, in order to fix it, the easiest way in my opinion is to change the type of icon for a String to parse it correctly, and then do the conversion to byte[] somewhere else... For example you can have a method in the class, let's say public byte[] getIconAsByteArray() {...}, that does the conversion.

否则,这可能是最的优雅的解决方案,你需要编写的。

Otherwise, and this is probably the most elegant solution, you need to write a custom deserializer.

这篇关于com.google.gson.JsonSyntaxException:预期BEGIN_ARRAY但STRING的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-25 11:37