Пример API: JsonTool tool = new JsonTool();
String json = tool.serialize(user);
String json1 = tool.serialize(user, "id:i")); //игнорировать свойство
String json2 = JsonTool.serialize(list, "[1].id:i")); //игнорировать свойство id второго элемента
//все свойства будут вызывать обратный вызов hibernateCheck
String json2 = JsonTool.serialize(obj, "*:!hibernate"));
Примеры стратегий сериализации:
Правила сериализацииПравила сериализации могут быть разными, каждый из которых содержит пару location и action, разделённые двоеточием, а сами правила сериализации разделены запятыми, что напоминает формат JSON, например:
name:i,user.id:i,~L/#ju.Collection*/:->null
Это означает три правила сериализации:
location и action могут содержать //, что напоминает скобки в языках программирования, внутри которых находятся параметры, например ~L/#ju.Collection*/## Действия Определяет действия, которые могут быть выполнены для соответствия, такие как игнорирование свойств, включение свойств, сортировка, переименование, условные проверки, присвоение значений, вызов обратных вызовов и т. д. * i: обозначает игнорирование, например, name:i — при встрече атрибута name его игнорировать. ~*:i/age,bir/ — игнорировать атрибуты типа age и bir класса, [1]:i — игнорировать вторую позицию, [name]:i — игнорировать элемент с ключом name, ~L/org. beetl. json. Foo/:i — игнорировать все атрибуты типа Foo. Атрибуты name и age всегда располагаются в начале. Остальные атрибуты располагаются в порядке (атрибуты сортируются с помощью встроенной AttributeComparator: примитивные типы впереди, затем POJO-типы, далее Java-типы, и в конце — коллекции).
"user": {"$ref":"$.list[0].user"}
Если также используются ci и cu, можно дополнительно вывести некоторые атрибуты, а не ограничиваться только "$ref":path. Например, если правило сериализации такое:
"~/User/:cu/name/"
это означает, что когда объект User встречается в циклической ссылке, помимо вывода $ref, также выводится атрибут name. Результат сериализации может выглядеть следующим образом:
"user": {"$ref":"$.list[0].user", "name": "xiandafu"}
Такой подход делает JSON более удобным для чтения, а некоторые фронтенд-фреймворки JavaScript могут использовать эти дополнительные атрибуты.
Определяет место сериализации, будь то имя свойства, выражение свойства, элемент массива или класс.* Простое свойство, например, name:nn/myName/ — при встрече свойства name текущий экземпляр выведет myName, nn — это действие, указывающее на New Name.
Обратите внимание, что в настоящее время не поддерживается использование выражений свойств после ~L/Class/.
JsonTool tool = new JsonTool();
tool.addLocationAction("~d", "f/yyyy.MM.dd/");
tool.addLocationAction("~L/java.util.Calendar*/", "$.getTime->f/yyyy-MM-dd/");
// Политика форматирования JSON, несколько locationAction разделены запятыми
tool.addPolicy("~f:n/#.##/,~c:?null->[]");
// По умолчанию используется компактный вывод, установка true включает переносы строк и отступы
tool.pretty = true;
tool.addAlias("loc", "org.beetl.json.test.location");
// Сериализация объекта User
String json = tool.serialize(User);
// или указание стратегии сериализации, age, name выводятся первыми, подходят для объектов с особыми требованиями или объектов, которые нельзя аннотировать (третьи стороны)
String json2 = tool.serialize(User, "~*:o/age,name/");
// та же стратегия, но свойство name выводится как code
String json2 = tool.serialize(User, "~*:o/age,name/,name:nn/code/");
// та же стратегия, но передача двух стратегий в API
String json2 = tool.serialize(User, "~*:o/age,name/", "name:nn/code/");
// Сериализация объекта dept, Department и SysUser имеют отношение один ко многим, если два класса повторно используются, то пропускаются свойства dept и users, вызывающие повторное использование
String json1 = tool.serialize(dept, "~L/#loc.SysUser/:ci/dept/,~L/#loc.Department/:ci/users/");## Примечания
По умолчанию можно использовать аннотации для определения стратегии сериализации.```java @Json( policys={ @JsonPolicy(location="name", action="nn/newUserName/"), @JsonPolicy(location="deleteList", action="?empty->[]") } ) public class User{ String name="joel"; int age =12; double salary=12.32266; Customer customer = new Customer(); List list = new ArrayList(); List deleteList = null; //getter and setter методы должны быть реализованы, но здесь они опущены }
```java
@Json(
policys={
@JsonPolicy(location="name", action="nn/userName/")
}
)
class Customer{
String name="lijz";
int age=11;
Date bir = new Date();
//getter and setter методы должны быть реализованы, но здесь они опущены
}
Разрешено создавать пользовательские действия для обработки специальных требований сериализации. Действия могут реализовывать интерфейс IValueAction
для обработки объектов, а также интерфейсы IKeyAction
, IInstanceAction
и другие.
В следующем примере кода реализован интерфейс IValueAction
, который проверяет, был ли объект действительно загружен Hibernate, и если нет, то не сериализует его, что позволяет избежать проблем с ленивой загрузкой Hibernate.```java
JsonTool tool = new JsonTool();
tool.addAction("hibernate", new IValueAction() {
@Override
public int getIndex() {
// TODO Auto-generated method stub
return 0;
}
@Override
public ActionReturn doit(OutputNodeKey field, Object value,
OutputNode thisNode, JsonWriter w) {
if (value instanceof HibernateProxy) { // объект-прокси Hibernate
LazyInitializer initializer = ((HibernateProxy) value).getHibernateLazyInitializer();
if (initializer.isUninitialized()) {
return new ActionReturn(null, ActionReturn.RETURN);
}
} else if (value instanceof PersistentCollection) { // коллекция связанных сущностей
PersistentCollection collection = (PersistentCollection) value;
if (!collection.wasInitialized()) {
return new ActionReturn(null, ActionReturn.RETURN);
} else if (collection.getValue() == null) {
return new ActionReturn(null, ActionReturn.RETURN);
}
}
return new ActionReturn(value, ActionReturn.CONTINUE);
}
});
String joins = "location,customer"; List cars = service.findAll(joins); String json = tool.serialize(cars, "*:!hibernate");
Можно создать пользовательскую функцию форматирования, как показано ниже.
```markdown
JsonTool.addFormat("simple", new MyDateFormatter());
public class MyDateFormatter implements Format {
public Object format(Object o) {
// TODO Auto-generated method stub
return "2015";
}
}
// Сериализация item, её свойство bir форматируется по правилу simple, f — это префикс действий, simple — зарегистрированный формат
String json1 = JsonTool.serialize(item, "bir:fsimple");
Код примера
@RequestMapping(value = "/json.html", method = RequestMethod.GET)
@ResponseBody
public List index1(HttpServletRequest req) {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(new Date());
return list;
}
Если вы хотите использовать кастомную стратегию сериализации, а не аннотации, вы можете использовать объект SerObject
@RequestMapping(value = "/json2.html", method = RequestMethod.GET)
@ResponseBody
public SerObject index2(HttpServletRequest req) {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(new Date());
SerObject s = new SerObject(list, "[1]:i"); // игнорировать второй элемент
return s;
}
Для более подробных примеров обратитесь к коду юнит-тестов https://git.oschina.net/xiandafu/beetl-json/tree/master/test
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>btjson</artifactId>
<version>0.94</version>
</dependency>
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )