【问题标题】:Android converting an object to JSON format with GSON not workingAndroid将对象转换为JSON格式,GSON不起作用
【发布时间】:2013-02-13 10:11:15
【问题描述】:

我正在尝试使用 GSON 将对象转换为 JSON 格式。然后我会将 JSON 发送到用 php 编写的 web 服务。不幸的是,由于某种原因,方法 gson.toJson(object) 不起作用。

我有这个 java 对象 - 干预(它包含字符串、日期、时间和位图类型的几个字段)。当我尝试这样做时:

Gson gson = new Gson();
String json = gson.toJson(intervention);

我在 gson 变量中得到这个:

gson={serializeNulls:falsefactories:[工厂[type=com.google.gson.JsonElement,adapter=com.google.gson.internal.bind.TypeAdapters$25@40fbe5c8], com.google.gson.internal.bind.ObjectTypeAdapter$1@411b7db8, 工厂[type=java.lang.String,adapter=com.google.gson.internal.bind.TypeAdapters$13@40ff42d0], 工厂[type=java.lang.Integer+int,adapter=com.google.gson.internal.bind.TypeAdapters$7@411c00f8], 工厂[type=java.lang.Boolean+boolean,adapter=com.google.gson.internal.bind.TypeAdapters$3@411b4798], 工厂[type=java.lang.Byte+byte,adapter=com.google.gson.internal.bind.TypeAdapters$5@4122dbd0], 工厂[type=java.lang.Short+short,adapter=com.google.gson.internal.bind.TypeAdapters$6@4122a0c8], Factory[type=java.lang.Long+long,adapter=com.google.gson. internal.bind.TypeAdapters$8@40fc5d98], 工厂[type=java.lang.Double+double,adapter=com.google.gson.Gson$4@412295f0], 工厂[type=java.lang.Float+float,adapter=com.google.gson.Gson$5@41229898], 工厂[type=java.lang.Number,adapter=com.google.gson.internal.bind.TypeAdapters$11@41223618], 工厂[type=java.lang.Character+char,adapter=com.google.gson.internal.bind.TypeAdapters$12@41224168], Factory[type=java.lang.StringBuilder,adapter=com.google.gson.internal. bind.TypeAdapters$16@411a7550], 工厂[type=java.lang.StringBuffer,adapter=com.google.gson.internal.bind.TypeAdapters$17@411a7790], 工厂[type=java.math.BigDecimal,adapter=com.google.gson.internal.bind.TypeAdapters$14@40ff4568], 工厂[type=java.math.BigInteger,adapter=com.google.gson.internal.bind.TypeAdapters$15@411b4440], 工厂[type=java.net.URL,adapter=com.google.gson.internal.bind.TypeAdapters$18@411be338], 工厂[type=java.net.URI,adapter=com.google.gson.internal.bind.TypeAdapters$19@41229028], 工厂[type=java.util.UUID,adapter=com.google.gson.internal.bind.TypeAdapters$21@411a2200], 工厂[type=java.util.Locale,adapter=com.google.gson.internal.bind.TypeAdapters$24@411a2510], 工厂[typeHierarchy=java.net.InetAddress,adapter=com.google.gson.internal.bind.TypeAdapters$20@41229328], 工厂[type=java.util.BitSet,adapter=com.google.gson.internal.bind.TypeAdapters$2@411ca140], com.google.gson.internal.bind.DateTypeAdapter$1@412024f8, 工厂[type=java.util.Calendar+java.util.GregorianCalendar,adapter=com.google.gson.internal.bind.TypeAdapters$23@411bef70], com.google.gson.internal.bind.TimeTypeAdapter$1@41229920, com.google.gson.internal.bind.SqlDateTypeAdapter$1@411b67c0, com.google.gson.internal.bind.TypeAdapters$22@411a2500, com.google.gson.internal.bind.ArrayTypeAdapter$1@41222e90, com.google.gson.internal.bind.TypeAdapters$26@411b7ca0, 工厂[type=java.lang.Class,adapter=com.google.gson.internal.bind.TypeAdapters$1@4121d940], com.google.gson.internal.Excluder@4122a3c8, com.google.gson.internal.bind.CollectionTypeAdapterFactory@40ff26d0, com.google.gson.internal.bind.MapTypeAdapterFactory@40ff2980, com.google.gson.internal.bind.ReflectiveTypeAdapterFactory@40ff2ba0],instanceCreators:{}}

import android.graphics.Bitmap;
import com.google.gson.annotations.SerializedName;
import java.util.Date;

公开课干预{

@SerializedName("case_id")
private String case_id;
public String getCase_id() {
    return case_id;
}

@SerializedName("user_id")
private String user_id;
public String getUser_id() {
    return user_id;
}

@SerializedName("account_id")
private String account_id;
public String getAccount_id() {
    return account_id;
}

@SerializedName("description")
private String description;
public String getDescription() {
    return description;
}

@SerializedName("solution")
private String solution;
public String getSolution() {
    return solution;
}

@SerializedName("status")
private String status;
public String getStatus() {
    return status;
}

@SerializedName("user_remarks")
private String user_remarks;
public String getUser_remarks() {
    return user_remarks;
}


@SerializedName("customer_remarks")
private String customer_remarks;
public String getCustomer_remarks() {
    return customer_remarks;
}

@SerializedName("case_complete")
private boolean case_complete;
public boolean isCase_complete() {
    return case_complete;
}

@SerializedName("charge_transport")
private boolean charge_transport;
public boolean isCharge_transport() {
    return charge_transport;
}

@SerializedName("service_billable")
private boolean service_billable;
public boolean isService_billable() {
    return service_billable;
}

@SerializedName("date_created")
private Date date_created;
public Date getDate_created() {
    return date_created;
}

@SerializedName("arrival_time")
private String arrival_time;
public String getArrival_time() {
    return arrival_time;
}

@SerializedName("departure_time")
private String departure_time;
public String getDeparture_time() {
    return departure_time;
}

@SerializedName("user_sign")
private Bitmap user_sign;
public Bitmap getUser_sign() {
    return user_sign;
}

@SerializedName("cust_sign")
private Bitmap cust_sign;
public Bitmap getCust_sign() {
    return cust_sign;
}

public void setUser_id(String user_id) {
    this.user_id = user_id;
}

public void setCase_id(String case_id) {
    this.case_id = case_id;
}


public void setAccount_id(String account_id) {
    this.account_id = account_id;
}



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



public void setSolution(String solution) {
    this.solution = solution;
}



public void setStatus(String status) {
    this.status = status;
}


public void setUser_remarks(String user_remarks) {
    this.user_remarks = user_remarks;
}



public void setCustomer_remarks(String customer_remarks) {
    this.customer_remarks = customer_remarks;
}



public void setCase_complete(boolean case_complete) {
    this.case_complete = case_complete;
}



public void setCharge_transport(boolean charge_transport) {
    this.charge_transport = charge_transport;
}

public void setService_billable(boolean service_billable) {
    this.service_billable = service_billable;
}


public void setDate_created(Date date_created) {
    this.date_created = date_created;
}

public void setArrival_time(String arrival_time) {
    this.arrival_time = arrival_time;
}


public void setDeparture_time(String departure_time) {
    this.departure_time = departure_time;
}

public void setUser_sign(Bitmap user_sign) {
    this.user_sign = user_sign;
}

public void setCust_sign(Bitmap cust_sign) {
    this.cust_sign = cust_sign;
}

}

上面的类是对象类。

我验证了对象干预并填充了字段。有人可以向我解释我在这里做错了什么吗?

【问题讨论】:

  • 你能添加对象的类吗?
  • @Warpzit,我添加了对象类
  • 尝试注释掉你的日期对象。
  • 好的,当我注释掉日期和位图时它可以工作。您知道如何使其适用于这些类型吗?
  • 日期可以使用一些解决方法位图不知道。如果你不回答,我稍后再回答。

标签: android json gson


【解决方案1】:

Gson (2.2.2) 的当前版本对Date 对象没有问题,并且可以很好地序列化/反序列化它们。如果您正在寻找一种特定的格式,您可以在GsonBuilder 中使用setDateFormat() 来指定它。

您的Bitmap 对象是另一个问题。这是一个非常复杂的对象,而不是 Gson 知道如何处理的东西(没关系,甚至很难用 JSON 表示)。您需要编写自定义序列化器和反序列化器来处理它。

查看Bitmap 的文档,您似乎可以使用getPixels() 将像素数据提取到int[] 数组中,并使用适当的静态createBitmap() 方法从该数据构造Bitmap。您将需要编写一个序列化器来生成 JSON(并且还包括其他参数),然后编写一个知道如何读取该 JSON 并返回 Bitmap 的反序列化器。

有关编写自定义序列化器/反序列化器的信息可以在 Gson 用户指南中找到:https://sites.google.com/site/gson/gson-user-guide#TOC-Custom-Serialization-and-Deserialization

【讨论】:

  • 这是正确的答案,但我建议以不同于 JSON 的方式处理图像。 JSON 根本不是处理此类事情的最佳工具 :)
  • @Warpzit - 是的,我来回发表评论我只是......保持原样:)
  • 谢谢你们。我实际上是使用将位图转换为 Base64 格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2016-08-07
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多