我们正在创建一个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)不适用于具有整数值的枚举?
enum和OurEnumTransformer的代码位于
之下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确实可以正常工作。
感谢任何帮助。