Java does different things based on a common type

At the moment, I have an object similar to the one below.

public class DataField implements JSONable
{
    public final String name;
    public final Class<?> typeClass;
    private Object data;

    public <T> DataField(String name, Class<T> typeClass)
    {
        this.name = name;
        this.typeClass = typeClass;

        data = null;
    }
    public <T> T getData(Class<T> passClass)
    {
        if(!typeClass.equals(passClass))
            throw new TypeMismatchException("Type mismatch");
        return passClass.cast(data);
    }
    public <T> T setData(T obj, Class<T> passClass)
    {
        if(!typeClass.equals(passClass))
            throw new TypeMismatchException("Type mismatch");
        data = (Object) obj;
    }
    public String toJSON()
    {
        //The part that bugs me
        StringBuilder sb = new StringBuilder();
        switch(type)
        {
        case "myPackage.DataField":
            if(isArray)
                return TakesADataObjOrCollectionOfDataObjs(sb,Arrays.asList(get(DataObj[].class)));
            else
                return TakesADataObjOrCollectionOfDataObjs(sb,get(DataObj.class));
        break;
        default:
            if(isArray)
                TakesAnObjectOrCollection(sb,Arrays.asList(get(Object[].class)));
            else
               TakesAnObjectOrCollection(sb,get(Object.class));
        break;
        }
        return sb.toString();
    }
}
//I did not include code for DataObj but it has a HashMap<String,DataField>
//fields on it and two functions for getting and setting field data 
//without actually divulging the field objects themselves.

: toJSON. ( TakesADataObjOrCollectionOfDataObjs TakesAnObjectOrCollection), , JSONable . , , Collection<?>, Collection<? extends JSONable>, .
, Object DataObj ( , , , Class<?> , ), List<?> List<? extends JSONable>.

: , , . , , , typeClass genericTypeClass. , , :

  • , typeClass, : , typeClass, genericTypeClass, , typeClass, genericTypeClass null.
  • ( get set), .
  • switch toJSON , , , genericTypeClass, , DataObj .


: , , ( , JSON DataField)?
>
, 3 4 , XY, .

+4
1

Jackson JSON Strings.

(), ... , , List :)

, .
Jackson Json.


, , :

public class Main {
    public final String mainStr = "Hello";

    public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
        final ObjectMapper om = new ObjectMapper();
        System.out.println("Serialized Main: " + om.writeValueAsString(new Main()));
        System.out.println("Serialized A: " + om.writeValueAsString(new A()));
        System.out.println("Serialized AA: " + om.writeValueAsString(new AA()));
        System.out.println("Serialized B: " + om.writeValueAsString(new B()));
        System.out.println("Serialized List of A: " + om.writeValueAsString(Collections.singletonList(new A())));
    }

    static class A extends Main {
        public final String aStr = "World";
        public final int aInt = 42;
    }

    static class AA extends A {
        public final String aaStr = "Foo";
    }

    static class B {
        public final String bStr = "Bar";
        public final boolean bBool = true;
    }
}

Ouptut:

Serialized Main: {"mainStr":"Hello"}
Serialized A: {"mainStr":"Hello","aStr":"World","aInt":42}
Serialized AA: {"mainStr":"Hello","aStr":"World","aInt":42,"aaStr":"Foo"}
Serialized B: {"bStr":"Bar","bBool":true}
Serialized List of A: [{"mainStr":"Hello","aStr":"World","aInt":42}]

, , .

!

+2

Source: https://habr.com/ru/post/1533003/


All Articles