Java:将包含枚举的对象转换为Json对象
我正在使用org.json库将对象转换为json格式。请检查下面的代码片段Java:将包含枚举的对象转换为Json对象,java,json,enums,Java,Json,Enums,我正在使用org.json库将对象转换为json格式。请检查下面的代码片段 public enum JobStatus implements Serializable{ INCOMPLETE, INPROGRESS, ABORTED, COMPLETED } public class Job implements Serializable { private string id; private JobStatus status;
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());
它显示如下输出:
{"id":"12345", "status" : {}}
它显示空白并添加卷底。这是什么意思?有人遇到过这个问题吗?首先,我强烈建议不要使用这个库(org.json),这是一个非常古老且不受支持的库(据我所知)。我建议还是 但如果确实需要JSONObject,可以将getter添加到enum中:
public enum JobStatus implements Serializable{
INCOMPLETE,
INPROGRESS,
ABORTED,
COMPLETED;
public String getStatus() {
return this.name();
}
}
序列化的结果:
{"id":"12345","status":{"status":"INPROGRESS"}}
正如我所知,JSONObject不支持正确序列化没有任何附加数据的枚举。似乎
JSONObject
不支持枚举。您可以更改作业
类以添加如下getter:
public String getStatus() {
return status.name();
}
然后,调用新JSONObject(job).toString()
生成:
{"id":"12345","status":"INPROGRESS"}
我会成功的。现在Enums
和DateTime
类型看起来很正常,在json对象中正确转换
我是作为一个寻求答案的人来到这个页面的,我的研究帮助我回答了这个问题。对我来说,我制作了一个接口,它可以由我在Json中必须使用的任何枚举实现,这个接口强制枚举从一个值中知道正确的枚举本身,而且它还应该返回一个值。。。因此,每个enum.CONSTANT都映射到任何类型的值(无论是数字还是字符串) 因此,当我想把这个enum放到一个Json对象中时,我要求enum.CONSTANT给我它的值,当我有这个值(来自Json)时,我可以要求enum给我映射到这个值的正确的enum.CONSTANT 界面如下(可以原样复制): 现在,要从Json对象获取您的值:
int areaValue = jsonObject.optInt(TAG,-1);
AreaType areaType = AreaType.NONE.getType(areaValue);
例如,如果areaValue为1,则AreaType将为“Area”,以此类推,类似于@Denys Denysiuk的回答但是如果您想返回任何值而不是字符串,我们可以这样使用。在下面的示例中,我希望返回值1或15而不是字符串
@Getter
public enum PaymentCollectionDay {
FIRST_OF_MONTH(1), FIFTEENTH_OF_MONTH(15);
PaymentCollectionDay(int day) {
this.day = day;
}
@JsonValue
final int day;
}
@丹雅:是的,你是对的。org.json太旧了。我肯定会搬到格森或杰克逊。谢谢你的宝贵建议。没有必要实现可序列化,因为默认情况下每个枚举都是可序列化的。我尝试了这个方法,但没有成功,JSON中的值为空。我的枚举非常简单;这有区别吗
public enum ServiceType{MULTI_MASTER,SINGLE_MASTER}
上述方法可帮助您将某类类型的对象转换为JSON对象,而无需在使用ObjectMapper库时篡改任何数据类型。因为我不知道你在用那个JSON对象做什么,我建议你在IDE中逐行调试代码,找出你的枚举数据丢失的地方。我希望您可能需要检查操作创建的JSON对象的代码。您应该有用于枚举的自定义序列化程序。请检查。请查看此链接:
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;
}
}
AreaType areaType = ...;
jsonObject.put(TAG,areaType.getValue());
int areaValue = jsonObject.optInt(TAG,-1);
AreaType areaType = AreaType.NONE.getType(areaValue);
@Getter
public enum PaymentCollectionDay {
FIRST_OF_MONTH(1), FIFTEENTH_OF_MONTH(15);
PaymentCollectionDay(int day) {
this.day = day;
}
@JsonValue
final int day;
}