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

时间:2017-12-18 19:06:41

标签: java json serialization gson

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

    menu = self.driver.find_element_by_id("active_config")

    ActionChains(self.driver).move_to_element(menu).click(menu).perform()
    if curr_config_loc < new_config_loc:
        for x in xrange(0, new_config_loc - curr_config_loc):
            ActionChains(self.driver).key_down(Keys.ARROW_DOWN).perform()
    elif curr_config_loc > new_config_loc:
        for x in xrange(0, curr_config_loc - new_config_loc):
            ActionChains(self.driver).key_down(Keys.ARROW_UP).perform()
    ActionChains(self.driver).key_down(Keys.ENTER).perform()

但它不起作用。

以下是一个例子:

@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);

我收到此错误:  java.lang.IllegalStateException:期望一个字符串但在第1行第48列路径为$ .extraData

的BEGIN_OBJECT

当我只想将“extraData”作为带有值

的字符串时
{
 "id":1,
 "name": "John Doe", 
 "extraData": {"someField1":"someValue1","someField2":"someValue2"}
}

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

2 个答案:

答案 0 :(得分:1)

如果您更改extraData的类型(假设可能并且额外数据遵循您描述的模式),则不会造成伤害

public Map<String, String> extraData;

并撰写String

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

答案 1 :(得分:0)

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

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