我在解析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; } }
如果您能帮助我解决这个问题,我将不胜感激。提前致谢
当您尝试解析该字段时会引发Exception "icon",因为在JSON响应中有一个字符串,并且您尝试将其解析为byte[]。
"icon"
byte[]
由于在您的类中icon是一个字节数组,因此当它尝试解析该字段时"icon"会说“ 期望一个数组 ”,但是在JSON响应"icon"中不是数组(没有被包围[ ]),因此它说“ 但是是一个字符串 “ …
icon
[ ]
编辑 :这就是说,为了解决这个问题,在我看来,最简单的方法是改变类型icon的String正确解析,然后进行转换到byte[]别的地方…例如,你可以在一个方法假设类public byte[] getIconAsByteArray() {...}进行转换。
String
public byte[] getIconAsByteArray() {...}
否则,这可能是最 优雅的 解决方案,您需要编写一个 自定义解串器 。