class JsonComponentImpl implements JsonComponent {
    
    private final ProjectComponent projectComponent;

    public JsonComponentImpl(ProjectComponent projectComponent) {
        this.projectComponent = requireNonNull(projectComponent);
    }

    @Override
    public <ENTITY> JsonEncoder<ENTITY> noneOf(Manager<ENTITY> manager) {
        return new JsonEncoderImpl<>(projectComponent.getProject(), manager);
    }

    @Override
    public <ENTITY> JsonEncoder<ENTITY> allOf(Manager<ENTITY> manager) {
        requireNonNull(manager);

        final JsonEncoder<ENTITY> formatter = noneOf(manager);

        manager.fields()
            .forEachOrdered(f ->
                formatter.put(jsonField(projectComponent.getProject(), f.identifier()),
                    f.getter()::apply
                )
            );

        return formatter;
    }

    @SafeVarargs
    @SuppressWarnings("varargs")
    @Override
    public final <ENTITY> JsonEncoder<ENTITY> of(Manager<ENTITY> manager, Field<ENTITY>... fields) {<FILL_FUNCTION_BODY>}
}

        requireNonNull(manager);
        requireNonNullElements(fields);
        final JsonEncoder<ENTITY> formatter = noneOf(manager);

        final Set<String> fieldNames = Stream.of(fields)
            .map(Field::identifier)
            .map(ColumnIdentifier::getColumnId)
            .collect(toSet());

        manager.fields()
            .filter(f -> fieldNames.contains(f.identifier().getColumnId()))
            .forEachOrdered(f
                -> formatter.put(jsonField(projectComponent.getProject(), f.identifier()),
                    f.getter()::apply
                )
            );

        return formatter;
    
<no_super_class>