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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在json反序列化中将对象保持为字符串相关的知识,希望对你有一定的参考价值。

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

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

答案

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

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

另一答案

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

public Map<String, String> extraData;

并撰写一个String

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

以上是关于在json反序列化中将对象保持为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Unity3D 中将类对象转换为 JSON 字符串?

使用休眠 jpa 进行 JSON 序列化和反序列化以在 JSON 响应中将父对象转换为子对象

在 C# 中将 JSON 数组反序列化为对象

在 symfony JMS PHP 中将单个字符串属性反序列化为对象

Json序列化与反序列化

Json序列化与反序列化