gpt4 book ai didi

java - 使用非构造函数方法反序列化为类

转载 作者:行者123 更新时间:2023-12-02 00:51:13 24 4
gpt4 key购买 nike

我正在尝试反序列化 Jackson 序列化的 Google Ads sdk 对象。特别是,我在实例化行为类似于枚举的特定类时遇到问题,例如:

public class CampaignStatus implements Serializable {
private String _value_;
private static HashMap _table_ = new HashMap();
public static final String _UNKNOWN = "UNKNOWN";
public static final String _ENABLED = "ENABLED";
public static final String _PAUSED = "PAUSED";
public static final String _REMOVED = "REMOVED";
public static final CampaignStatus UNKNOWN = new CampaignStatus("UNKNOWN");
public static final CampaignStatus ENABLED = new CampaignStatus("ENABLED");
public static final CampaignStatus PAUSED = new CampaignStatus("PAUSED");
public static final CampaignStatus REMOVED = new CampaignStatus("REMOVED");
private static TypeDesc typeDesc = new TypeDesc(CampaignStatus.class);

protected CampaignStatus(String value) {
this._value_ = value;
_table_.put(this._value_, this);
}

public String getValue() {
return this._value_;
}

public static CampaignStatus fromValue(String value) throws IllegalArgumentException {
CampaignStatus enumeration = (CampaignStatus)_table_.get(value);
if (enumeration == null) {
throw new IllegalArgumentException();
} else {
return enumeration;
}
}

public static CampaignStatus fromString(String value) throws IllegalArgumentException {
return fromValue(value);
}

public boolean equals(Object obj) {
return obj == this;
}

public int hashCode() {
return this.toString().hashCode();
}

public String toString() {
return this._value_;
}

public Object readResolve() throws ObjectStreamException {
return fromValue(this._value_);
}

public static Serializer getSerializer(String mechType, Class _javaType, QName _xmlType) {
return new EnumSerializer(_javaType, _xmlType);
}

public static Deserializer getDeserializer(String mechType, Class _javaType, QName _xmlType) {
return new EnumDeserializer(_javaType, _xmlType);
}

public static TypeDesc getTypeDesc() {
return typeDesc;
}

static {
typeDesc.setXmlType(new QName("https://adwords.google.com/api/adwords/cm/v201809", "CampaignStatus"));
}
}

序列化 Campaign 对象(其中包含上面定义的 CampaignStatus)时,JSON 如下所示:

“状态”:{“值”:“已启用”}

尝试将 JSON 营销 Activity 写入 Campaign 对象时,反序列化器会引发不匹配的输入异常。由于这些对象归 Google 所有,因此我无法修改现有类或添加注释。我的解决方案需要适用于 250 多个遵循此模式的类,因此单独包装或扩展这些类并不是一个可行的解决方案。此外,我将让许多不同的利益相关者序列化这些对象,因此修改它们的序列化方式也不是一个可用的解决方案。

我需要的是某种方式来向反序列化器表明,当它遇到这样的情况时,它应该查找 fromValue 方法并使用它。我可以明确说明使用这种方法需要哪些 json 键/值;我只需要一种比扩展类或添加注释更动态的方式来修改序列化。

最佳答案

您可以使用@JsonCreator注释来指示工厂方法 - Jackson将使用它来执行反序列化。

在您的情况下,它看起来像这样:

    @JsonCreator
public static CampaignStatus fromValue(@JsonProperty("value") String value) throws IllegalArgumentException {
CampaignStatus enumeration = (CampaignStatus)_table_.get(value);
if (enumeration == null) {
throw new IllegalArgumentException();
} else {
return enumeration;
}
}

我对您到底想要实现的目标有点困惑,但请随意在上面的方法中添加满足您要求的任何逻辑。

关于java - 使用非构造函数方法反序列化为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57857634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com