Как исключить пустые поля при использовании Flexjson? - PullRequest
6 голосов
/ 25 октября 2011

Я сериализирую такой класс в JSON, используя Flexjson:

public class Item {
    private Long id;
    private String name;
    private String description;
    ...

    // Getters and setters
    ...
}

Многие поля элемента могут быть нулевыми (например, описание). Следовательно, когда такой объект Item сериализуется с использованием Flexjson, я получаю следующий JSON:

 {"id":62,"name":"Item A","description":null,...}

Поскольку, как я уже упоминал, объект Item может содержать много полей с нулевым значением, выходной JSON длиннее, чем необходимо. Это пока проблема, потому что я хотел бы отправить сгенерированный JSON с веб-сервера на мобильный клиент по беспроводному соединению через WiFi, 3G, EDGE или GPRS (т. Е. Требуется большая пропускная способность, что приводит к меньшей скорости ).

Поэтому я хотел бы спросить, как можно (эффективно) исключить атрибуты с нулевым значением с помощью Flexjson?

Спасибо!

Ответы [ 3 ]

17 голосов
/ 16 апреля 2012

Вы можете использовать следующий трансформатор:

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)

Обратите внимание, что все пустые поля будут исключены.

Добавление Transformer by Path (vs by Class) не поддерживается, так как FlexJSON заставляет TypeTransformer для нулевых значений:

JSONContext.java: строка 95:

private Transformer getPathTransformer(Object object) {
    if (null == object) return getTypeTransformer(object);
    return pathTransformerMap.get(path);
}
1 голос
/ 21 сентября 2012

Я новичок, у меня была та же проблема, и я не смог найти никакого решения в исходной кузнице, поэтому я использовал регулярное выражение для удаления всех нулей из строки 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();
}
0 голосов
/ 09 марта 2012

Я не опробовал вашу ситуацию точно, но я полагаю, что следующее должно решить вашу проблему:

Item item;
// Assign item here
JSONSerializer json = new JSONSerializer();
if ( item.description != null ) {
  json.exclude( field );
}
return json.serialize(item);

Очевидно, что вы, вероятно, получите доступ к полю описания, используя геттер.Кроме того, вы можете захотеть итерировать поля вашего экземпляра, используя отражение, чтобы исключить пустые поля.

...