You can accomplish this by doing 2 things:
- Adding a lookup method as well as a
toString()
override to your enum (MyStateEnum
); and - Extending XStream's
AbstractSingleValueConverter
instead of implementingConverter
MyStateEnum
:
public enum MyStateEnum {
// Everything you had is fine
// But now, add:
public static MyStateEnum getMyStateByDesc(String desc) {
for(MyStateEnum myState : MyStateEnum.values())
if(myState.getDesc().equals(desc))
return myState;
return null;
}
@Override
public String toString() {
return getDesc();
}
}
MyStateEnumConverter
:
public class MyStateEnumConverter extends AbstractSingleValueConverter {
@Override
public boolean canConvert(Class clazz) {
return clazz.equals(MyStateEnum.class);
}
@Override
public Object fromString(String parsedText) {
return MyStateEnum.getMyStateByDesc(parsedText);
}
}
By adding getMyStateByDesc(String)
to your enum, you now have a way to look up all the various enumerated values from the outside, by providing a desc
string. The MyStateEnumConverter
(which extends AbstractSingleValueConverter
) uses your toString()
override under the hood to associate aMyStateEnum
instance with a text string.
So when XStream is parsing the JSON, it sees a JSON object of, say, "opened", and this new converter knows to pass "opened" into the converter's fromString(String)
method, which in turn uses getMyStateByDesc(String)
to lookup the appropriate enum instance.
Don't forget to register your converter with your XStream
instance as you already showed in your original question.