import java.util.*;
import java.lang.*;
import java.io.*;
import java.lang.reflect.*;

// The main method must be in a class named "Main".
class Main {
    public static void main(String[] args) throws Exception {
        Persona persona = new Persona("Juan", 30, Arrays.asList("Fútbol", "Música", "Lectura"));

        // Serializar a JSON
        String json = JsonMapper.serialize(persona);
        System.out.println("JSON: " + json);

        // Deserializar a objeto
        Persona deserializado = JsonMapper.deserialize(json, Persona.class);
        System.out.println("Objeto: " + deserializado.nombre + ", " + deserializado.edad + ", " + deserializado.hobbies);
    }
}

class Persona {
    public String nombre;
    public int edad;
    public List<String> hobbies;

    public Persona() {} // Constructor necesario para la deserialización

    public Persona(String nombre, int edad, List<String> hobbies) {
        this.nombre = nombre;
        this.edad = edad;
        this.hobbies = hobbies;
    }
}


class JsonMapper {

    /** Serializa un objeto Java a su representación en JSON */
    public static String serialize(Object obj) throws IllegalAccessException {
        if (obj == null) return "null";

        Class<?> clazz = obj.getClass();

        // Manejo de tipos primitivos y Strings
        if (clazz == String.class) return "\"" + obj.toString() + "\"";
        if (clazz == Character.class) return "\"" + obj.toString() + "\"";
        if (Number.class.isAssignableFrom(clazz) || clazz == Boolean.class) return obj.toString();

        // Manejo de listas y colecciones
        if (obj instanceof Collection) {
            Collection<?> collection = (Collection<?>) obj;
            StringBuilder json = new StringBuilder("[");
            for (Object item : collection) {
                json.append(serialize(item)).append(",");
            }
            if (!collection.isEmpty()) json.deleteCharAt(json.length() - 1);
            json.append("]");
            return json.toString();
        }

        // Manejo de mapas
        if (obj instanceof Map) {
            Map<?, ?> map = (Map<?, ?>) obj;
            StringBuilder json = new StringBuilder("{");
            for (Map.Entry<?, ?> entry : map.entrySet()) {
                json.append("\"").append(entry.getKey().toString()).append("\":")
                        .append(serialize(entry.getValue())).append(",");
            }
            if (!map.isEmpty()) json.deleteCharAt(json.length() - 1);
            json.append("}");
            return json.toString();
        }

        // Manejo de objetos personalizados (POJOs)
        StringBuilder json = new StringBuilder("{");
        for (Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            Object value = field.get(obj);
            json.append("\"").append(field.getName()).append("\":")
                    .append(serialize(value)).append(",");
        }
        if (clazz.getDeclaredFields().length > 0) json.deleteCharAt(json.length() - 1);
        json.append("}");
        return json.toString();
    }

    /** Deserializa un JSON en un objeto de Java */
    public static <T> T deserialize(String json, Class<T> clazz) throws Exception {
        if (json == null || json.equals("null")) return null;

        // Manejo de tipos primitivos y String
        if (clazz == String.class) return clazz.cast(json.replaceAll("^\"|\"$", ""));
        if (clazz == int.class || clazz == Integer.class) return clazz.cast(Integer.parseInt(json));
        if (clazz == double.class || clazz == Double.class) return clazz.cast(Double.parseDouble(json));
        if (clazz == boolean.class || clazz == Boolean.class) return clazz.cast(Boolean.parseBoolean(json));

        // Manejo de listas (asumiendo que la clase tiene un constructor sin argumentos)
        if (clazz.isAssignableFrom(List.class)) {
            List<Object> list = new ArrayList<>();
            String innerJson = json.substring(1, json.length() - 1);
            String[] items = innerJson.split(",");
            for (String item : items) {
                list.add(item.replaceAll("^\"|\"$", ""));
            }
            return clazz.cast(list);
        }

        // Manejo de objetos personalizados
        T obj = clazz.getDeclaredConstructor().newInstance();
        json = json.substring(1, json.length() - 1); // Elimina { }
        String[] fields = json.split(",");

        for (String field : fields) {
            String[] keyValue = field.split(":");
            if (keyValue.length < 2) continue;
            String key = keyValue[0].replaceAll("^\"|\"$", "").trim();
            String value = keyValue[1].trim();

            Field objField = clazz.getDeclaredField(key);
            objField.setAccessible(true);

            if (objField.getType() == String.class) objField.set(obj, value.replaceAll("^\"|\"$", ""));
            else if (objField.getType() == int.class || objField.getType() == Integer.class)
                objField.set(obj, Integer.parseInt(value));
            else if (objField.getType() == double.class || objField.getType() == Double.class)
                objField.set(obj, Double.parseDouble(value));
            else if (objField.getType() == boolean.class || objField.getType() == Boolean.class)
                objField.set(obj, Boolean.parseBoolean(value));
        }

        return obj;
    }
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: