Juravskiy Vitaliy`s blog
Преобразование Java объектов в JSON
Существует большое количество реализаций библиотек для работы с форматом JSON. В процессе изучения исходных кодов нескольких библиотек, выяснилось, что способы преобразования в JSON и обратно могут быть разные. Для преобразование Java объекта в JSON формат, наиболее простой способ, это использование Java аннотации для полей класса и функции формирования JSON строки. Рассмотрим на примере:
Аннотацией необходимо пометить поля класса, который должен быть преобразован в JSON формат, так же поля класса могут содержать ссылки на массивы, объектов поля которых тоже помечены аннотацией.
Например так:
Преобразованием объекта помеченного аннотацией, занимается класс JsonWriter, в котором реализована рекурсивная процедура формирования строки, рекурсивный вызов происходит для тех полей, которые являются массивом, и помечены аннотацией. Если вы хотите помечать коллекции объектов, и также преобразовывать их в строки формата JSON, то я думаю не сложно модифицировать функцию под выполнение этой задачи.
package example.json; import java.lang.reflect.Field; public class JsonWriter { public String getJsonString(Object o) { return buildJson(o); } /** * Создает JSON строку на основе класса переданного в параметре о. Поля класса, которые должны участовать в процесседолжны быть помечены анотацией {@link JsonName}. * @param o объект поля которого помечены аннотацией {@link JsonName} * @return json string */ private String buildJson(Object o) { StringBuffer json = new StringBuffer(); json.append("{"); Field [] fs = o.getClass().getDeclaredFields(); for (int i = 0; i < fs.length; i++) { Field f = fs[i]; f.setAccessible(true); Object value = null; try { value = f.get(o); } catch (IllegalArgumentException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } if(f.isAnnotationPresent(JsonName.class) && value != null) { json.append("\"") .append(f.getAnnotation(JsonName.class).id()) .append("\"") .append(":"); try { if(value instanceof String) { json.append("\"") .append(value.toString()) .append("\""); } else if(f.getType().isArray()) { json.append("["); Object[] ar = (Object[])value; for (int j = 0; j < ar.length; j++) { json.append(buildJson(ar[j])); if(j != ar.length - 1) json.append(","); } json.append("]"); } else { json.append(value.toString()); } if(i != fs.length - 1) json.append(","); } catch (IllegalArgumentException e) { e.printStackTrace(); } } } json.append("}"); return json.toString(); } }Несложно заметить что для поиска полей, помеченных аннотациями используется механизм отражения (reflection).
Пример использования всего выше перечисленного:
Результат будет следующим:
{"name":"Ivan","age":26,"id":1,"children":[{"name":"Alex","age":5,"id":2}]}Преобразование обратно, уже не является такой простой задачей, которую можно решить "с ходу".
Теги:
Java
Java Script
Информационные технологии
JSON
reflection
аннотации
преобразование в JSON