Java:将包含枚举的对象转换为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;

我正在使用org.json库将对象转换为json格式。请检查下面的代码片段

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;
}