使用以整数值形式接收的flexjson反序列化枚举

时间:2013-01-16 09:06:58

标签: java serialization enums flexjson

我们正在创建一个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确实可以正常工作。

感谢任何帮助。

0 个答案:

没有答案