【问题标题】:Keep object as string in json deserialization在json反序列化中将对象保留为字符串
【发布时间】:2017-12-18 19:06:40
【问题描述】:

我有一个类,其中包含一些字段和额外的字符串类型数据,将存储一个 json 对象。我希望它不被反序列化,但是找了一个多小时后,我唯一发现的是:

@Expose(deserialize=false)

但它不起作用。

以下是一个例子:

public class Employee implements Serializable
{


    private static final long serialVersionUID = 1L;

    @Expose
    public Long id;
    @Expose
    public String name; 
    ... some more fields

    @SerializedName("extraData")
    @Expose(deserialize = false)
    public String extraData;



}

然后在我的服务中,我执行以下操作:

    final GsonBuilder builder = new GsonBuilder();

    final Gson gson = builder.create();

    Employee emp = gson.fromJson(json, Employee.class);

我从前端收到的对象是:

{
 "id":1,
 "name": "John Doe", 
 "extraData": {"someField1":"someValue1","someField2":"someValue2"}
}

我得到这个错误: java.lang.IllegalStateException:应为字符串,但在第 1 行第 48 列路径 $.extraData 处为 BEGIN_OBJECT

当我只想将“extraData”作为具有值的字符串获取时

{"someField1":"someValue1","someField2":"someValue2"}

不接受其他解决方案,因为这是我给出的规范。

【问题讨论】:

  • 怎么样? "{\"someField1\":\"someValue1\",\"someField2\":\"someValue2\"}"

标签: java json serialization gson


【解决方案1】:

如果你改变extraData的类型也没有坏处(假设它是可能的并且额外的数据遵循你描述的模式)

public Map<String, String> extraData;

并为其撰写String

Jaron F 的建议总体上可能会更好。使用类型适配器见this answer

【讨论】:

    【解决方案2】:

    您应该为此使用TypeAdapters,然后在对象创建期间将TypeAdapter 添加到您的gson 构建器中。

    https://google.github.io/gson/apidocs/com/google/gson/TypeAdapter.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-20
      • 2014-01-04
      • 2020-02-03
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      相关资源
      最近更新 更多