Одна статья, чтобы заставить Джексона анализировать данные JSON

JSON
Одна статья, чтобы заставить Джексона анализировать данные JSON

Разбор Json — учебник по Джексону

Ежедневная похвала, спасибо боссу.

Добро пожаловать на публичный номер: на самом деле это Овен. Галантерея продолжает обновляться......

在这里插入图片描述

1. Разбор JSON

Я имею в виду синтаксический анализ: сериализация и десериализация между JSON и JavaObject.

Если ваш проект отделен от фронтенда и бекенда, то вы должны были использовать JSON для взаимодействия с данными, а бэкенд определенно будет включать разбор данных Json, хотя SpringMvc и @requestBody уже помогли нам разобрать и сопоставить с bean-компонентом , но нижний уровень также выполняется с помощью этих библиотек синтаксического анализа JSON (по умолчанию SpringMVC использует Jackson). Когда наш бэкенд напрямую вызывает интерфейсы других сервисов, многие из них также возвращают данные JSON, и нам нужно использовать эти библиотеки для их разбора самостоятельно.

Во-вторых, общая библиотека разбора JSON.

  • fastjson: библиотека классов синтаксического анализа JSON, созданная Alibaba.Он очень быстрый и предоставляет множество статических методов, которые просты в использовании, но базовая реализация не очень хороша.В процессе синтаксического анализа используется подстрока String, которая имеет хорошую производительность. , но может вызвать утечку памяти.
  • Gson: Библиотека классов для синтаксического анализа JSOn, созданная Google, но производительность немного хуже, чем у других.
  • Джексон: Относительно рекомендуемая библиотека разбора JSON с хорошей и стабильной производительностью. Исходный код Джексона размещен по адресу:GitHub.com/faster XML/Просто…

3. Использование Джексона

1. Введение в зависимость от Maven

<dependency>  
      <groupId>com.fasterxml.jackson.core</groupId>  
      <artifactId>jackson-databind</artifactId>  
      <version>${jackson-version}</version>  
</dependency>  
<dependency>  
      <groupId>com.fasterxml.jackson.core</groupId>  
      <artifactId>jackson-core</artifactId>  
      <version>${jackson-version}</version>  
</dependency>  
<dependency>  
      <groupId>com.fasterxml.jackson.core</groupId>  
      <artifactId>jackson-annotations</artifactId>  
      <version>${jackson-version}</version>  
</dependency> 
<!-- 其中Jackson Annotations依赖Jackson Core,Jackson Databind依赖Jackson Annotations。-->

2. Основное использование

десериализовать

  1. Используйте ObjectMapper для преобразования строки json в объект:
String str = "{\"id\":1,\"name\":\"haha\",\"elements\":[{\"age\":1,\"elName\":\"zll\"},{\"age\":2,\"elName\":\"zll1\"}]}";
ObjectMapper objectMapper = new ObjectMapper();
TestBean testBean = objectMapper.readValue(str, TestBean.class);
System.out.println(testBean.toString());

результат операции:

TestBean(id=1, name=haha, elements=[Element(age=1, elName=zll), Element(age=2, elName=zll1)])
  1. Используйте ObjectMapper для чтения некоторых значений полей в json
        String str = "{\"id\":1,\"name\":\"haha\",\"elements\":[{\"age\":1,\"elName\":\"zll\"},{\"age\":2,\"elName\":\"zll1\"}]}";
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode jsonNode = objectMapper.readTree(str);
        //获取name字段值
        JsonNode name = jsonNode.get("name");
        String s = name.asText();
        System.out.println(s);
        //获取elements字段下数组第二个对象的age
        JsonNode elements = jsonNode.get("elements");
        JsonNode object2 = elements.get(1);//从0开始哦
        JsonNode age = object2.get("age");
        int i = age.asInt();
        System.out.println(i);

результат операции:

haha
2

Сериализация

  1. ObjectMapper (преобразование JavaObject в JSON)
Element element = new Element();
element.setAge(1);
element.setElName("zll");
ObjectMapper objectMapper = new ObjectMapper();
String elementStr = objectMapper.writeValueAsString(element);
System.out.println(elementStr);

Результат выглядит следующим образом:

{"age":1,"elName":"zll"}

Другие распространенные методы сериализации:

  • writeValue(File arg0, Object arg1) преобразует arg1 в последовательность json и сохраняет ее в файл arg0
  • writeValue(OutputStream arg0, Object arg1) преобразует arg1 в последовательность json и сохраняет ее в выходной поток arg0.
  • teValueAsBytes(Object arg0) преобразует arg0 в последовательность json и выводит результат в виде массива байтов
  • writeValueAsString(Object arg0) преобразует arg0 в последовательность json и выводит результат в виде строки.
  1. JsonGenerator (генератор json):

Вы можете создать json с соответствующей структурой в соответствии с вашими потребностями.

        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        //JsonFactory jsonFactory = new JsonFactory();
        //创建jsonfactory 2种方法
        ObjectMapper objectMapper = new ObjectMapper();
        JsonFactory jsonFactory = objectMapper.getFactory();
        JsonGenerator generator = jsonFactory.createGenerator(bout);
        //创建自己需要的json
        //创建对象获取数组要写开始和结束
        generator.writeStartObject();
            //创建一个字段 第一个参数key 第二个参数value
            generator.writeStringField("name","value");
            generator.writeNumberField("numberName",1);
            //或者直接创建object
            generator.writeObjectField("ObjectName","ObjectValue");
            //创建数组
            generator.writeArrayFieldStart("arrayName");
                //里面可以是对象、数组、字符串、数字
                generator.writeString("element1");
                generator.writeNumber(1);
                generator.writeNumber(1);
            generator.writeEndArray();
        generator.writeEndObject();
        generator.flush();
        generator.close();
        String s = bout.toString();
        System.out.println(s);

Результаты:

{"name":"value","numberName":1,"ObjectName":"ObjectValue","arrayName":["element1",1,1]}

2. Общие настройки ObjectMapper

ObjectMapper objectMapper = new ObjectMapper();  
 
//序列化的时候序列对象的所有属性  
objectMapper.setSerializationInclusion(Include.ALWAYS);  
 
//反序列化的时候如果多了其他属性,不抛出异常  
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);  
 
//如果是空对象的时候,不抛异常  
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);  
 
//属性为null的转换
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
 
//取消时间的转化格式,默认是时间戳,可以取消,同时需要设置要表现的时间格式  
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);  
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

3. Общие примечания

  1. @JsonIgnoreProperties (ignoreUnknown = true):

    Когда эта аннотация загружается в класс, несуществующие поля будут игнорироваться.

  2. @JsonIgnoreProperties({ "пароль", "секретный ключ" }):

    Указать поля игнорирования

  3. @JsonIgnore:

    отмечено в аннотации, это поле будет проигнорировано

  4. @JsonFormat (часовой пояс = "GMT+8", шаблон = "гггг-ММ-дд ЧЧ: мм: сс"):

    Сериализация метки на самоконце времени форматируется по установленным правилам (по умолчанию преобразуется в метку времени)

  5. @JsonInclude (параметр)

    JsonInclude.Include.NON_EMPTY: атрибут пуст или null не участвует в сериализации JsonInclude.Include.NON_NULL: свойство имеет значение null и не участвует в сериализации.

  6. @JsonProperty("firstName")

    Отметьте поле, укажите сериализованное имя поля

  7. @JsonDeserialize (используя = T расширяет JsonDeserializer.class) и @JsonSerialize (использует = T расширяет JsonSerializer.class)

    Настройка правил сериализации и десериализации для определенных типов полей

Четвертый, последний

Краткое содержание

Дополнительные ресурсы:На самом деле Овен

приветственная звезда

ежедневные комплименты

  • Если вы считаете, что эта статья полезна для вас, пожалуйста, "прочитать/переслать/лайкнуть/пометить", спасибо
  • Если вы все еще найдете лучшие или другие идеи, пожалуйста, не стесняйтесь, дайте мне знать в области сообщений, а также обсудите и обменяйтесь исправлениями вместе, большое спасибо

Добро пожаловать на официальный аккаунт: галантерейные товары "На самом деле Овен" постоянно обновляются...

在这里插入图片描述