В Java Json сериализации, нельзя игнорировать поглотитель
Чтобы воспроизвести проблему
public class AjaxJson {
private boolean success; private String msg; private Object obj; private Map<String, Object> attributes; //getter and setter public String getJsonStr() { JSONObject obj = new JSONObject(); obj.put("success", this.isSuccess()); obj.put("msg", this.getMsg()); obj.put("obj", this.obj); obj.put("attributes", this.attributes); return obj.toJSONString(); } }
Выше является интерфейс класса, мы должны предназначаться последовательности этого класса в возвращении JSon. Тогда SpringMVC вообще работает.
@RequestMapping(params = "/get")
@ResponseBody
public AjaxJson del(HttpServletRequest request) { AjaxJson json = new AjaxJson(); //省略业务操作 return json; }
По умолчанию, он возвращает ResponseBody
объект непосредственно сериализации JSON. На этот раз, мы можем посмотреть на JSON вернулась.
{
"success": "true",
"Msg":"1", "obj":{ ... }, "attributes": null, "jsonStr":"{"success": "true","Msg":"1","obj":{...},"attributes": null,}" }
Очевидно, что мы ожидаем и хотим не то же самое, еще один jsonstr поля. На этот раз я думал, не SpringMVC проблемы. Результаты тщательно обдумывать, springnvc разум может непосредственно сериализовать объект в JSON, в самом деле, мы добавим профиль на работе, реальную работу участвуют в сериализации Джексоне этой библиотеки. Таким образом, я использую Джексон в одиночку, и результаты возвращаются в формате JSON строка такие же , как и раньше, в соответствии с которым он может быть уверен , что дизайн самой библиотеки, Джексоны.
Глубина исследования
С помощью этого любопытства, я поставил Java обычно используется в библиотеках JSON сериализации попытались увидеть , если все это. Основная библиотека имеет Джексон, fastjson и gson.
После того, как тест нашел, JSON строку джексон и Али вернулись fastjson представлены с полем jsonstr, за исключением gson Google возвращает результаты мы ожидали - только сериализованное поле объекта.
Так что я нашел ряд принципов в этих библиотеках:
- джексон fastjson и
в последовательности времени, прежде всего найти методом отражения получить классы объектов , чтобы получить следующий, и в нижнем регистре, а каждое ключевое значение JSON, и получить возвращаемое значение в качестве значения. Далее, повторное отражение поле , добавляется в формате JSON. - gson
не нашел популярный аргумент, но он чувствует , что должен добытчика методов и не имеет ничего общего.
Таким образом, вы можете видеть, что есть большой getJsonStr наш AjaxJson класс, поэтому, jsonStr его в качестве ключа, в сериализованная в формате JSON.
Конечно, джексон, при условии , что соответствующая аннотации, такие методы могут быть проигнорированы. В первом методе плюс @JsonIgnore
вы можете.
Личное понимание
- При возникновении проблем, не упускать из вида некоторых простых мест, такие как методы получения и установки. С getXXX месте, вы можете использовать такие альтернативы, как принести.
- Иногда мы определили в классе , такие как
private int mAge
переменные и методы геттерgetAge()
. Очевидно , что мы надеемся , что в последовательности времени , чтобы получить ключ к возрасту , а не магу, то метод геттера отражения также имеет смысл своего существования.