APEX ENUM从JSON序列化和反序列化

时间:2013-10-18 22:54:03

标签: json serialization enums salesforce apex

我有使用枚举属性定义的APEX类,这些属性将被序列化为JSON。此外,我正在阅读JSON并将它们反序列化回我定义的类。

为了使枚举属性与JSON转换一起使用,我创建了另一个Integer属性,该属性获取枚举的序数并根据枚举值列表设置枚举。见下文:

枚举定义:

public enum DataSourceType {
    NA,
    ArbitronSummary,
    ArbitronTally,
    NielsenSummary,
    NielsenTally,
    Scarborough,
    Strata,
    None
}
public enum FilterJoinType {
    AndJoin,
    OrJoin,
    NotJoin
}
public enum HourByHourInterval {
    NA0,
    NA1,
    Quarterly,
    NA3,
    Hourly
}

APEX类定义:

public class HourByHourRequest {
    public List<String> Books { get; set; }
    public DataSourceType eDataSource { get; set; }
    public Integer DataSource {
        get {
            if (eDataSource == null)
                return 0;
            return eDataSource.ordinal();
        }
        set {
            eDataSource = lib_ap.DataSourceType.values()[value];
        }
    }
    public FilterJoinType eFilterJoinType { get; set; }
    public Integer FilterJoinType {
        get {
            if (eFilterJoinType == null)
                return 0;
            return eFilterJoinType.ordinal();
        }
        set {
            eFilterJoinType = lib_ap.FilterJoinType.values()[value];
        }
    }
    public HourByHourInterval eInterval { get; set; }
    public Integer Interval {
        get {
            if (eInterval == null)
                return 0;
            return eInterval.ordinal();
        }
        set {
            eInterval = lib_ap.HourByHourInterval.values()[value];
        }
    }
}

APEX代码使用类序列化为JSON并从JSON反序列化:

HourByHourRequest request = new HourByHourRequest();

request.Books = new List<String>();
request.Books.add('BookName');

request.eDataSource = DataSourceType.ArbitronTally;
request.eFilterJoinType = FilterJoinType.AndJoin;
request.eInterval = HourByHourInterval.Hourly;

String jsonStr = JSON.serialize(request);
HourByHourRequest request2 = (HourByHourRequest)JSON.deserialize(request, HourByHourRequest.class);

我使用Integer属性与每个枚举属性一起使用的原因是因为在序列化为JSON时,枚举值将丢失。因此,具有相应的Integer值将保留JSON中的值,该值可以成功反序列化...除了上面显示的代码。由于每个枚举/整数字段对的“重复字段”错误,上述代码实际上将在反序列化部分失败。枚举时,枚举和整数字段都包含在JSON字符串中,即使只有整数字段保留该值。

示例JSON:

{"Interval":4,
"eInterval":{},
"FilterJoinType":0,
"eFilterJoinType":{},...

我的问题:有没有办法忽略序列化为JSON的字段?这将解决“重复字段”错误。否则,在转换为/从JSON转换时,如何以合适的方式处理枚举?谢谢!

1 个答案:

答案 0 :(得分:1)

https://salesforce.stackexchange.com/questions/18498/apex-enum-serialize-to-and-deserialize-from-json得到答案。

基本上,您可以将字段标记为要被忽略的字段,以便序列化为JSON。