1

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

任何帮助表示赞赏。

4

0 回答 0