我们正在创建一个 JSON REST 客户端应用程序,该应用程序必须与用 C# 编写的服务进行通信。FlexJson 库可以轻松解决大多数问题,例如日期差异等。
但有一件事没有:作为整数发送的枚举值,这是从服务接收的值,并且必须映射到它们的 Java Enum 值。
Java枚举是可以的,我们当然可以将整数转换为枚举,只要值存在。但是我们没有成功获取到 Flexjson 来转换值。
其中一个枚举称为FormState
我们编写了一个自定义的 Transformer,我们称之为OurEnumTransformer,它扩展了 AbstractTransformer 并实现了 ObjectFactory。在反序列化时,我们添加.use(Enum.class, OurEnumTransformer),如果不这样做,我们会收到如下错误:
不知道如何将 4 转换为 FormState 的枚举常量
这是有道理的,因为它是一个整数而不是枚举值的名称
但是我们添加了.use(...)我们不断收到反序列化错误:
FormState 缺少无参数构造函数。Flexjson 将实例化任何受保护的、私有的或公共的无参数构造函数。
但它确实有一个私有的无参数构造函数。
另一件事是在 OurEnumTransformer 中设置的断点永远不会被命中。
那么谁能帮助我为什么.use(Enum.class, OurEnumTransformer)不适用于具有整数值的枚举?
下面的枚举和OurEnumTransformeris的代码
public enum FormState {
None(0),
EditMode(1),
SignedBySender(2),
AddedToRide(4),
SignedByTransporter(8),
SignedByReceiver(16),
DLT_UNKNOWN();
private int value;
private FormState() {
this.value= -1;
}
private FormState(int value) {
this.value= value;
}
public int getValue()
{
return value;
}
private static final Map<Integer, FormState> intToTypeMap = new HashMap<Integer, FormState>();
static
{
for(FormState type: FormState.values())
{
intToTypeMap.put(type.value, type);
}
}
public static FormState fromInt(int i) {
FormState type = intToTypeMap.get(Integer.valueOf(i));
if (type == null)
return FormState.DLT_UNKNOWN;
return type;
}
}
和工厂
public final class OurEnumTransformer extends AbstractTransformer implements
ObjectFactory {
@SuppressWarnings("rawtypes")
@Override
public Object instantiate(ObjectBinder context, Object value, Type targetType,
Class targetClass)
{
if(targetClass.equals(FormState.class))
return FormState.fromInt((Integer)value);
else if(targetClass.equals(TrajectState.class))
return TrajectState.fromInt((Integer)value);
else
throw new JSONException(String.format("%s: Don't know how to convert %s to enumerated constant of %s",
context.getCurrentPath(), value, targetType));
}
@Override
public void transform(Object arg0) {
// TODO Auto-generated method stub
}
}
最后调用代码:
List<JsonTrajectModel> result = null;
JSONDeserializer<List<JsonTrajectModel>> deser = new JSONDeserializer<List<JsonTrajectModel>>();
result = deser
.use(Date.class, dateTransformer)
.use("values", JsonTrajectModel.class)
.use(Enum.class, enumTransformer)
.deserialize(jsonData);
在最后一个代码块中,jsonData 是一个有效的 JSON 字符串,而 enumTransformer 是 OurEnumTransformer 实例。
最后一点,此代码中使用的 dateTransformer 确实可以发挥作用。
任何帮助表示赞赏。