пятница, 3 января 2014 г.

Jasper Reports и JRDataSource из строки JSON

Иногда поля основного источника данных приходят из разных мест() и в разных форматах данных. Я хотел бы рассмотреть один частный случай, т.е. когда одно из полей(field) основного источника данных является строкой JSON и его нужно как-то обработать или же обработать и использовать его в качестве исходных данных нового источника данных для таблицы или вложенного отчета.
Итак, допустим, что некоторое поле $F{field} является строкой, содержащей JSON (Array), в таком случае, можно сделать интересный финт ушами и создать из этой строки полноценный DataSource. 
new net.sf.jasperreports.engine.data.JRMapCollectionDataSource(
    (java.util.Collection<java.util.Map<String,?>>) new org.json.simple.parser.JSONParser().parse($F{details})
)
Вот такой вот простой трюк позволяет использовать один из типов источников данных Jasper Reports и сразу преобразовать JSON в объектную модель Java. Учтите, это будет работать только в том случае, если в classpath приложения, которое будет рендерить, отчет будет библиотека Simple JSON.
Дело в том, что JRMapCollectionDataSource принимает коллекцию карт (ассоциативных массивов, мап) в качестве исходных для источника данных каждая следующая запись - следующая мапа в коллекции, каждой поле датасэта - это значение, взятое по одноименному ключу из мапы. В случае с JSON и библиотекой Simple JSON мы парсим массив объектов и получаем на выходе объект класса JSONArray, который наследует ArrayList (соответственно, реализует Collection). Далее, JSONArray состоит из объектов JSONObject, которые реализуют java.util.Map. В итоге, мы получаем пример совместимости здравого смысла абсолютно независимых разработчиков в виде совместимого и продуманного интерфейса (что в случае Jasper Reports - феномен).

Комментариев нет:

Отправить комментарий