java com.google.gson.JsonSyntaxException:应为 BEGIN_ARRAY,但为 STRING
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16566644/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
com.google.gson.JsonSyntaxException: Expected BEGIN_ARRAY but was STRING
提问by Wijden
I am facing this error in parsing json data :
我在解析 json 数据时遇到这个错误:
Expected BEGIN_ARRAY but was STRING at line 1 column 1156
I could'nt find the solution. My json data is :
我找不到解决方案。我的 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"
}
]
}
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);
The code where I deserialize the JSON response :
我反序列化 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);
This is my ProjectContainer class :
这是我的 ProjectContainer 类:
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;
}
}
I would greatly appreciate if you can help me solve this problem. Thanks in advance
如果您能帮我解决这个问题,我将不胜感激。提前致谢
回答by MikO
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[]
.
当您尝试解析 field 时会抛出异常"icon"
,因为在您的 JSON 响应中有一个字符串,您尝试将其解析为byte[]
.
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"...
由于在您的班级中,icon
是一个字节数组,当它尝试解析该字段时,"icon"
它说它“需要一个数组”,但在 JSON 响应中,"icon"
它不是一个数组(没有任何东西被 包围[ ]
),所以它说“但是是一个字符串“...
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.
编辑:也就是说,为了修复它,我认为最简单的方法是更改icon
for a的类型String
以正确解析它,然后将其转换为byte[]
其他地方...例如,您可以在类,让我们说public byte[] getIconAsByteArray() {...}
,进行转换。
Otherwise, and this is probably the most elegantsolution, you need to write a custom deserializer.
否则,这可能是最优雅的解决方案,您需要编写自定义 deserializer。