使用 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 时如何排除空值字段?的主要内容,如果未能解决你的问题,请参考以下文章

Flexjson 和 Dexguard/Proguard

如何使 .populate 排除空值?

如何使用 FlexJSON 序列化 Map<String, List<Object>>

如何在全球范围内忽略具有恢复响应的 Null 字段?

如何从 Mongoose 填充查询中排除空值

JQuery序列化表单排除空值的问题