@Override
 public void writeOmittedField(String fieldName) throws IOException {
   // basically combination of "writeFieldName()" and "writeNull()"
   if (_writeContext.writeFieldName(fieldName) == JsonWriteContext.STATUS_EXPECT_VALUE) {
     _reportError("Can not skip a field, expecting a value");
   }
   // Hmmh. Should we require a match? Actually, let's use logic: if field found,
   // assumption is we must add a placeholder; if not, we can merely ignore
   CsvSchema.Column col = _schema.column(fieldName);
   if (col == null) {
     // assumed to have been removed from schema too
   } else {
     // and all we do is just note index to use for following value write
     _nextColumnByName = col.getIndex();
     // We can basically copy what 'writeNull()' does...
     _verifyValueWrite("skip positional value due to filtering");
     _writer.write(_columnIndex(), "");
   }
 }
 private final void _writeFieldName(String name) throws IOException {
   // just find the matching index -- must have schema for that
   if (_schema == null) {
     // not a low-level error, so:
     _reportMappingError("Unrecognized column '" + name + "', can not resolve without CsvSchema");
   }
   // note: we are likely to get next column name, so pass it as hint
   CsvSchema.Column col = _schema.column(name, _nextColumnByName + 1);
   if (col == null) {
     if (isEnabled(JsonGenerator.Feature.IGNORE_UNKNOWN)) {
       _skipValue = true;
       _nextColumnByName = -1;
       return;
     }
     // not a low-level error, so:
     _reportMappingError(
         "Unrecognized column '" + name + "': known columns: " + _schema.getColumnDesc());
   }
   _skipValue = false;
   // and all we do is just note index to use for following value write
   _nextColumnByName = col.getIndex();
 }