可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am using org.json library to convert Object to Json format. Kindly check the below code snippet.
public enum JobStatus implements Serializable{ INCOMPLETE, INPROGRESS, ABORTED, COMPLETED } public class Job implements Serializable { private string id; private JobStatus status; ... } ... // Create Job Object Job job = new Job("12345", JobStatus.INPROGRESS); // Convert and print in JSON format System.out.println(new JSONObject(job).toString());
It shows the output like this :
{"id":"12345", "status" : {}}
It shows blank and adds Curly bases. What does it mean? Is anybody gone through this problem?
回答1:
First of all I highly recommend do not use this library (org.json), this is very old and unsupported (as i know) library. I suggest Jackson or Gson.
But if you really need JSONObject, you can add getter into enum:
public enum JobStatus implements Serializable{ INCOMPLETE, INPROGRESS, ABORTED, COMPLETED; public String getStatus() { return this.name(); } }
result of serialization:
{"id":"12345","status":{"status":"INPROGRESS"}}
As I know, JSONObject don't support correct serialization of enums which not have any additional data inside.
回答2:
It seems JSONObject doesn't support enums. You could alter your Job class to add a getter like this:
public String getStatus() { return status.name(); }
then, invoking new JSONObject(job).toString() produces:
{"id":"12345","status":"INPROGRESS"}
回答3:
ObjectMapper mapper= new ObjectMapper(); new JSONObject(mapper.writeValueAsString(job));
would do the trick. Now Enums and DateTime types looks normal and is converted properly in json objects.
I came to this page as a person seeking answer and my research helped me to answer this question.
回答4:
for me, i made an interface that shuold be implemented by any enum i will have to use in Json, this interface forces the enum to know the proper enum itself from a value, and also it should return a value ... so every enum.CONSTANT is mapped to a value of any type (weather a number or a String)
so when i want to put this enum in a Json Object, i ask the enum.CONSTANT to give me it's value, and when i have this value (from Json), i can request from the enum to give me the proper enum.CONSTANT mapped to this value
the interface is as follows (you can copy it as it is) :
/** * * this interface is intended for {@code enums} (or similar classes that needs * to be identified by a value) who are based on a value for each constant, * where it has the utility methods to identify the type ({@code enum} constant) * based on the value passed, and can declare it's value in the interface as * well * * @param <T> * the type of the constants (pass the {@code enum} as a type) * @param <V> * the type of the value which identifies this constant */ public interface Valueable<T extends Valueable<T, V>, V> { /** * get the Type based on the passed value * * @param value * the value that identifies the Type * @return the Type */ T getType(V value); /** * get the value that identifies this type * * @return a value that can be used later in {@link #getType(Object)} */ V getValue(); }
now here is an example for a small enum implementing this interface:
public enum AreaType implements Valueable<AreaType, Integer> { NONE(0), AREA(1), NEIGHBORHOOD(2); private int value; AreaType(int value) { this.value = value; } @Override public AreaType getType(Integer value) { if(value == null){ // assume this is the default return NONE; } for(AreaType a : values()){ if(a.value == value){ // or you can use value.equals(a.value) return a; } } // assume this is the default return NONE; } @Override public Integer getValue() { return value; } }
to save this enum in a Json :
AreaType areaType = ...; jsonObject.put(TAG,areaType.getValue());
now to get your value from a Json Object :
int areaValue = jsonObject.optInt(TAG,-1); AreaType areaType = AreaType.NONE.getType(areaValue);
so if the areaValue is 1 for example, the AreaType will be "Area", and so on
回答5:
You should have custom serializer for Enum. Please check http://www.baeldung.com/jackson-serialize-enums.