📖摘要
今天分享下 —— 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));
生成的调试日志将遵循以下内容:
11:24:33.092(92520000)| USER_DEBUG | [11] | ERROR | {“ obscurityLevel”:{}}
请注意,这也将阻止枚举保持在视图状态,并且我相信也会对
Database.Batchable
的状态产生一些影响。
另一个选择是将您的对象强制转换为
Map
,这可以使用内置的JSON
方法完成,然后先对Map
进行突变,然后再将其以所需状态重新序列化。它可以用于通过标准JSON
方法处理大量对象,但随后专门处理枚举。我发现这比使用JSONGenerator
和JSONParser
类容易得多。
🎉最后
-
更多参考精彩博文请看这里:《陈永佳的博客》
-
喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97480.html