Json Json сериализации в сериализации внимания к проблемам в Java, нельзя игнорировать поглотитель

В 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(). Очевидно , что мы надеемся , что в последовательности времени , чтобы получить ключ к возрасту , а не магу, то метод геттера отражения также имеет смысл своего существования.

ссылки

рекомендация

отwww.cnblogs.com/kexianting/p/11649392.html