在json反序列化中将对象保持为字符串

问题描述 投票:-1回答:2

我有一个类,其中包含一些字段和类型字符串的额外数据,用于存储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"}

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

java json serialization gson
2个回答
0
投票

你应该使用TypeAdapters,然后在对象创建过程中将TypeAdapter添加到你的gson构建器中。

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


1
投票

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

public Map<String, String> extraData;

并撰写一个String

Jaron F提出的建议可能总体上更好。有关使用类型适配器的信息,请参阅this answer

© www.soinside.com 2019 - 2024. All rights reserved.