Skip to content

Extra ',' in generated JSON if all attributes are filtered #381

@creinig

Description

@creinig

Scenario:

  • class "Outer" contains field of type "Inner" (interface, with concrete instance "InnerImpl")
  • InnerImpl contains one field
  • The serializer is configured with a custom filter which filters out that field

This causes InstanceSerializerImpl#serializeSubtypeInstance() to insert a "class" attribute into the JSON stream for InnerImpl, followed by a comma. Since InnerImpl does contain fields, that comma is not removed. But since all fields are filtered, the comma is not followed by another field either. => The generated JSON is invalid:
{"inner":{"class":"com.iisy.solvatio.common.util.BoonIssueTest$InnerImpl",}}

Problematic code location:

Unit test to reproduce the problem:

package com.iisy.solvatio.common.util;

import static org.junit.Assert.assertFalse;

import org.boon.core.reflection.fields.FieldAccess;
import org.boon.json.JsonSerializer;
import org.boon.json.JsonSerializerFactory;
import org.boon.json.serializers.FieldFilter;
import org.boon.primitive.CharBuf;
import org.junit.Test;

public class BoonIssueTest {

    public static class Outer {
        private Inner inner;

        public Inner getInner() {
            return inner;
        }

        public void setInner(Inner inner) {
            this.inner = inner;
        }
    }

    public static interface Inner {

    }

    public static class InnerImpl implements Inner {
        private String implementationDetail = "Psst";

        public String getImplementationDetail() {
            return implementationDetail;
        }

        public void setImplementationDetail(String implementationDetail) {
            this.implementationDetail = implementationDetail;
        }

    }

    public class InternalsFilter implements FieldFilter {
        @Override
        public boolean include(final Object parent, final FieldAccess fieldAccess) {
            if (fieldAccess.name().equals("implementationDetail")) {
                return false;
            }
            return true;
        }

    }

    @Test
    public void emptySubtype() {
        Outer obj = new Outer();
        obj.setInner(new InnerImpl());
        JsonSerializerFactory factory = new JsonSerializerFactory().addFilter(new InternalsFilter());
        JsonSerializer serializer = factory.create();

        CharBuf serialized = serializer.serialize(obj);
        System.out.println(serialized);
        assertFalse(serialized.toString().contains(",}"));
    }

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions