Skip to content

Instantly share code, notes, and snippets.

@LukasRychtecky
Created December 29, 2022 12:37
Show Gist options
  • Save LukasRychtecky/02c1b8a2c36f16e51705296a600e5721 to your computer and use it in GitHub Desktop.
Save LukasRychtecky/02c1b8a2c36f16e51705296a600e5721 to your computer and use it in GitHub Desktop.
package org.example.jplayground;
import java.util.List;
import java.util.stream.Collectors;
public class ToJsonProblem {
interface SerializableValue<X> {
X serialize();
}
static class SerializableLong implements SerializableValue<String> {
final Long value;
public SerializableLong(Long value) {
this.value = value;
}
@Override
public String serialize() {
return this.value.toString();
}
}
static class SerializableBoolean implements SerializableValue<String> {
final Boolean value;
public SerializableBoolean(Boolean value) {
this.value = value;
}
@Override
public String serialize() {
return this.value.toString();
}
}
static class SerializableList implements SerializableValue<String> {
final List<SerializableValue<String>> value;
public SerializableList(List<SerializableValue<String>> value) {
this.value = value;
}
@Override
public String serialize() {
return new StringBuilder()
.append("[")
.append(value.stream().map(SerializableValue::serialize).collect(Collectors.joining(", ")))
.append("]")
.toString();
}
}
public static void main(String[] args) {
var list = new SerializableList(
List.of(
new SerializableLong(1L),
new SerializableLong(2L),
new SerializableLong(3L)));
System.out.println(
list.serialize()
);
}
}
@DominikMostek
Copy link

import java.util.List;
import java.util.stream.Collectors;

public class ToJsonProblem {

    interface SerializableValue {
        <X> X accept(Serializer<X> serializer);
    }


    interface Serializer<X> {
        X serialize(Long l);

        X serialize(Boolean b);

        X serialize(List<SerializableValue> l);

        X serialize(Object o);
    }


    static class SpecificSerializableValuePerType_Boolean implements SerializableValue {

        private final Boolean b;

        SpecificSerializableValuePerType_Boolean(Boolean b) {
            this.b = b;
        }

        @Override
        public <X> X accept(Serializer<X> serializer) {
            return serializer.serialize(b);
        }
    }

    static class SpecificSerializableValuePerType_List implements SerializableValue {

        private final List<SerializableValue> list;

        SpecificSerializableValuePerType_List(List<SerializableValue> list) {
            this.list = list;
        }

        @Override
        public <X> X accept(Serializer<X> serializer) {
            return serializer.serialize(list);
        }
    }

    static class StringSerializer implements Serializer<String> {

        @Override
        public String serialize(Long l) {
            return l.toString();
        }

        @Override
        public String serialize(Boolean b) {
            return b ? "tru" : "nope";
        }

        @Override
        public String serialize(List<SerializableValue> l) {
            String values = l.stream().map(i -> i.accept(this)).collect(Collectors.joining(", "));
            return "[" + values + "]";
        }

        @Override
        public String serialize(Object o) {
            return o.toString();
        }
    }

    public static void main(String[] args) {
        StringSerializer stringSerializer = new StringSerializer();
        var list =
                new SpecificSerializableValuePerType_List(List.of(
                        new SpecificSerializableValuePerType_Boolean(Boolean.TRUE),
                        new SpecificSerializableValuePerType_Boolean(Boolean.FALSE),
                        new SpecificSerializableValuePerType_List(List.of(
                                new SpecificSerializableValuePerType_Boolean(Boolean.FALSE),
                                new SpecificSerializableValuePerType_Boolean(Boolean.TRUE)
                        )))
                );
        System.out.println(
            list.accept(stringSerializer)
        );
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment