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

导读:本篇文章讲解 APEX ENUM序列化到JSON和从JSON反序列化,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

📖摘要


今天分享下 —— APEX ENUM序列化到JSON和从JSON反序列化,欢迎关注!


🌂问题描述

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

为了使enum属性与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(jsonStr, HourByHourRequest.class);

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

样本JSON:

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

我的问题

有没有办法忽略要序列化为JSON的字段?这样可以解决“重复字段”错误。否则,在转换为JSON或从JSON转换时,如何处理枚举的合适方法?

回答

声明您的成员瞬态,JSON序列化器将忽略它。匿名块中的快速验证(是的,您可以在匿名块中声明类!)

public enum Obscurity{ OBVIOUS, OPAQUE, WTF }
public class Thing{
    public Obscurity obscurityLevel;
    public transient Obscurity notSerialized;
}

Thing t = new Thing();
t.obscurityLevel = Obscurity.OBVIOUS;
t.notSerialized = Obscurity.OPAQUE;

System.debug(LoggingLevel.Error,JSON.serialize(t));

生成的调试日志将遵循以下内容:

112433.09292520000| USER_DEBUG | [11] | ERROR | {“ obscurityLevel”:{}}

请注意,这也将阻止枚举保持在视图状态,并且我相信也会对 Database.Batchable 的状态产生一些影响。

另一个选择是将您的对象强制转换为 Map ,这可以使用内置的 JSON 方法完成,然后先对 Map 进行突变,然后再将其以所需状态重新序列化。它可以用于通过标准 JSON 方法处理大量对象,但随后专门处理枚举。我发现这比使用JSONGeneratorJSONParser 类容易得多。


🎉最后

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97480.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!