【问题标题】:How to exclude null-value fields when using Flexjson?使用 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 排除空值属性?

谢谢!

【问题讨论】:

    标签: java json jsonserializer 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 访问描述字段。此外,您可能希望使用反射来迭代您的实例字段以排除空字段。

        【讨论】:

        • 是的,在我看来这是唯一的解决方案。谢谢
        猜你喜欢
        • 2010-10-11
        • 1970-01-01
        • 2023-01-22
        • 2020-03-27
        • 1970-01-01
        • 2018-07-24
        • 2017-03-02
        • 1970-01-01
        • 2021-07-11
        相关资源
        最近更新 更多