使用 Flexjson 时如何排除空值字段?
Posted
技术标签:
【中文标题】使用 Flexjson 时如何排除空值字段?【英文标题】:How to exclude null-value fields when using Flexjson? 【发布时间】:2011-12-14 18:17:04 【问题描述】:我正在使用 Flexjson 将这样的类序列化为 JSON:
public class Item
private Long id;
private String name;
private String description;
...
// Getters and setters
...
许多项目字段可以为空(例如,描述)。因此,当使用 Flexjson 序列化这样的 Item 对象时,我得到以下 JSON:
"id":62,"name":"Item A","description":null,...
正如我已经提到的,由于一个 Item 对象可能包含许多空值字段,因此输出的 JSON 比实际需要的要长。到目前为止,这是一个问题,因为我想通过 WiFi、3G、EDGE 或 GPRS 的无线连接将生成的 JSON 从 Web 服务器发送到移动客户端(即,需要更多带宽,这会导致速度降低)。
因此,我想问一下如何(有效地)使用 Flexjson 排除空值属性?
谢谢!
【问题讨论】:
【参考方案1】:您可以使用以下转换器:
import flexjson.transformer.AbstractTransformer;
public class ExcludeTransformer extends AbstractTransformer
@Override
public Boolean isInline()
return true;
@Override
public void transform(Object object)
// Do nothing, null objects are not serialized.
return;
具有以下用法:
new JSONSerializer().transform(new ExcludeTransformer(), void.class).serialize(yourObject)
请注意,所有空字段都将被排除。
不支持按路径(与按类)添加转换器,因为 FlexJSON 强制 TypeTransformer 用于空值:
JSONContext.java:第 95 行:
private Transformer getPathTransformer(Object object)
if (null == object) return getTypeTransformer(object);
return pathTransformerMap.get(path);
【讨论】:
【参考方案2】:我是新手,我遇到了同样的问题,在源代码伪造上找不到任何解决方案,所以我使用正则表达式从 JSON 字符串中删除所有空值
/**
* This Function removes all the key:value pairs from the Json String for which the value equals null
* @param jsonStringWithNullKeys
* @return jsonStringWithoutNullKeys
*/
public static String getJsonStringWithoutNullKeys(String jsonStringWithNullKeys)
Pattern p = Pattern.compile( "([,]?\"[^\"]*\":null[,]?)+" );
Matcher m = p.matcher( jsonStringWithNullKeys );
StringBuffer newString = new StringBuffer( jsonStringWithNullKeys.length() );
while( m.find() )
if( m.group().startsWith( "," ) & m.group().endsWith( "," ) ) m.appendReplacement( newString, "," );
else
m.appendReplacement( newString, "" );
m.appendTail( newString );
return newString.toString();
【讨论】:
【参考方案3】:我没有确切地尝试过你的情况,但我相信以下应该可以解决你的问题:
Item item;
// Assign item here
JSONSerializer json = new JSONSerializer();
if ( item.description != null )
json.exclude( field );
return json.serialize(item);
显然,您可能会使用 getter 访问描述字段。此外,您可能希望使用反射来迭代您的实例字段以排除空字段。
【讨论】:
是的,在我看来这是唯一的解决方案。谢谢以上是关于使用 Flexjson 时如何排除空值字段?的主要内容,如果未能解决你的问题,请参考以下文章