Изучите FastJSON досконально, ищите эту статью!

Java
Изучите FastJSON досконально, ищите эту статью!

Привет всем, я Сяо Цай, Сяо Цай, который хочет быть Цай Буцаем в интернет-индустрии. Она может быть мягкой или жесткой, как она мягкая, а белая проституция жесткая!Черт~ Не забудьте поставить мне тройку после прочтения!

Эта статья в основном знакомитFastJSON 的使用

При необходимости вы можете обратиться к

Если это поможет, не забудьтеподобно

Официальный аккаунт WeChat открыт,Хорошая еда, студенты, которые не обратили внимания, не забудьте обратить внимание!

Введение в JSON

JSON (нотация объектов JavaScript) — это облегченный формат обмена данными. Это облегчает людям чтение и письмо. В то же время машине также удобно анализировать и генерировать. Он использует"ключ: значение"Правильный текстовый формат для хранения и представления данных, который часто используется в процессе обмена данными между системами, является идеальным языком обмена данными.

«Эпоха XML закончилась, теперь эпоха JSON». Я полагаю, что многие люди сейчас молча согласились с этой точкой зрения, поэтому серьезно ли мы задумались, почему именно сейчас?JSONможет заменитьXMLположение дел. Кратко рассмотрим два представления:

<?xml version="1.0" encoding="gb2312"?>
<class>
    <stu id="001">
        <name>杨过</name> 
        <sex>男</sex>
        <age>20</age>
    </stu>  
    <stu id="002">
        <name>小龙女</name>    
        <sex>女</sex>
        <age>21</age>
    </stu>
</class>
[
    {
        "id": "001",
        "name": "杨过",
        "sex": "男",
        "age": "20"
    },
    {
        "id": "002",
        "name": "小龙女",
        "sex": "女",
        "age": "21"
    }
]

Оба метода используются для описания простой информации о классе, информации не так много, но ее хорошо видноJSONСравниватьXMLБолее лаконично. Конкретные отличия могут заключаться в следующем:

  • читабельность:Можно сказать, что удобочитаемость JSON и XML сопоставима, с простым синтаксисом с одной стороны и стандартизированной формой тега с другой, трудно отличить победителей от проигравших.
  • Расширяемость:XML по своей природе является расширяемым, и, конечно, JSON также имеет его, поэтому, если XML может быть расширяемым, JSON также может быть расширяемым.
  • Сложность кодирования:XML имеет богатые инструменты кодирования, такие как DOM4J, JDom и т. д. JSON также предоставляет множество инструментов. Но без инструментов, поскольку XML имеет много структурных символов, программирование относительно сложно.
  • Сложность декодирования:При синтаксическом анализе XML необходимо учитывать родительский узел дочернего узла, что сложнее, в то время как сложность синтаксического анализа JSON почти равна 0, и кажется, что структуру данных можно понять.

Осведомленность JSON

JSON имеет следующую форму
  • JSON 对象

源网侵删

{
    "id": "002",
    "name": "小龙女",
    "sex": "女",
    "age": "21"
}

Это простой объект JSON, мы можем наблюдать некоторый синтаксис JSON:

  1. данные в фигурных скобках[]
  2. данные с键 : 值в виде пар (где ключи в основном в виде строк, а значения могут быть строками, числами и объектами JSON)
  3. каждые два键 : 值пары разделяются запятыми,, последняя пара ключ-значение должна быть опущена,

Мы следуем вышеизложенному3Точечные функции, вы можете легко создать объект JSON

  • JSON 数组

源网侵删

["value1","value2","value3"]

или

[
    {
        "id": "001",
        "name": "杨过",
        "sex": "男",
        "age": "20"
    },
    {
        "id": "002",
        "name": "小龙女",
        "sex": "女",
        "age": "21"
    }
]

Представление массива также очень простое:

  1. голова и хвост по[]пакет
  2. Первичный ключ данных начинается с,разделенный
  • JSON 字符串

源网侵删

'{"id": "001", "name": "杨过", "sex": "男", "age": "20"}'

Строки JSON очень похожи на строки Java.

  1. это должно начинаться с""или''Обертка данных, поддержка различных операций над строками
  2. Формат данных внутри может бытьjson-объект,так же может бытьjson-массивИли сочетание двух основных форм

ВышеупомянутоеJSONосновная форма,JSONМожет использоваться на разных языках, каждый со своимJSONСпособ реализации. Теперь давайте познакомимся сJavaна языкеFastJSONиспользование.

FastJSON

FastJSONЭто синтаксический анализатор и генератор JSON, основанный на JAVA, разработанный инженерами Alibaba. Его можно использовать для преобразования объектов Java в их представления JSON, а также для преобразования строк JSON в эквивалентные объекты Java.FastJSONМожет работать с произвольными объектами Java, включая уже существующие объекты без исходного кода.

FastJSON очень удобен в использовании, нам нужно использовать его только в проекте Maven.pomВ файл могут быть введены следующие зависимости:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.73</version>
</dependency>

Класс входа для FastJSON API:com.alibaba.fastjson.JSON, общие операции сериализации можно найти вJSONСтатические методы в классах выполняются напрямую.

API

Мы ввели в проектFastJSON, а пользовательский класс уже существует:

@Data
public class User {
    private int id;

    private String name;

    private String sex;
    
    private int age;
}
toJSONString(Object o)

Этот метод обычно является наиболее распространенным, т.JavaBeanСериализация в текст JSON

Передавая объект, мы можем преобразовать объект в строку JSON, здесь мы передаем не толькоJavaBeanтакже может бытьОбъект карты

проходить вОбъект картыМы также можем получить строку JSON.Список объектовТакже хорошо работает:

Результат - стандартJSONArrayНить

если мы предположимtoJSONString(Object o)Вывод только одной монотонной строки заставляет вас выглядеть немного затруднительно, тогда мы можем использоватьtoJSONString(Object o, boolean prettyFormat)Чтобы вывод выглядел более удобным:

пройти черезJSONВстроенное форматирование делает результат более четким, что очень интимно~

Некоторые друзья думают, что я обычно устаю от использования этих двух вещей.Где вы на это смотрите?Сяокай думает об этом, и это имеет смысл. Затем введитеtoJSONStringрасширенное использование.

JSON.toJSONString(Object object, SerializerFeature... features)

Мы видим, что в этом методе есть параметр SerializerFeature..., может показаться немного странным, действительно, я тоже очень странный, давайте посмотрим, чтоSerializerFeature, через исходный код мы можем найтиSerializerFeatureЭто оказался класс перечисления:

Не расстраивайтесь, увидев эту картинку.Хотя примеров на ней много,большинство из них@deprecatedАннотации, указывающие на то, что они устарели. Какие мы обычно используем:

объект описывать
SerializerFeature.UseSingleQuotes используйте одинарные кавычки вместо двойных кавычек, по умолчаниюfalse
SerializerFeature.PrettyFormat Независимо от того, отформатирован ли результат, по умолчаниюfalse
SerializerFeature.WriteDateUseDateFormat Если время относится к типу данных или временной метки, инициализируйте время в этом формате."yyyy-MM-dd HH:mm"
SerializerFeature.WriteMapNullValue Выводить ли поля, значение которых равно null, по умолчаниюfalse
SerializerFeature.WriteClassName Запись информации о типе при сериализации, по умолчаниюfalse

Случаи применения:

  • SerializerFeature.UseSingleQuotes

Используйте одинарные кавычки вместо двойных кавычек, по умолчаниюfalse

  • SerializerFeature.PrettyFormat

Независимо от того, отформатирован ли результат, по умолчаниюfalse

  • SerializerFeature.WriteDateUseDateFormat

Если время относится к типу данных или временной метки, инициализируйте время в этом формате."yyyy-MM-dd HH:mm"

Таким образом, мы выводим дату в фиксированном формате:yyyy-MM-dd HH:mm, иногда не хочется получить этот формат, что делать, всегда есть способы:

Этот метод поддерживает пользовательский формат времени, но используемый методtoJSONStringWithDateFormat(), вам нужно обратить внимание на это, не используйте неправильный метод в то время и не говорите гарнирыотморозок ~

  • SerializerFeature.WriteMapNullValue

Выводить ли поля, значение которых равно null, по умолчаниюfalse.

Какая польза от этого, мы должны очень четко указать в спецификации разработки, чтобы поощрять использованиеJavaBeanПередайте параметры, чтобы свести к минимуму передачуMapпередать параметры, потому чтоMapЭто эквивалентно черному ящику. Для пользователя пользователь не знает, какие поля в нем существуют, а для создателя предполагается, что он забудет, какие поля в нем существуют. Чтобы решить эту боль,JSONТакже был представлен обходной путь:

По общемуtoJSONString()Метод, нулевое значение похоже насъестьНу, это вполне может быть катастрофой развития!

  • SerializerFeature.WriteClassName

Запись информации о типе при сериализации, по умолчаниюfalse. Этот метод можно использовать во время десериализации следующим образом:

Таким образом, мы можем видеть, какой тип объекта мы сериализуем.

ВышеупомянутыеtoJSONStringРасширенное использование , у вас, ребята, полный урожай ~

vx search: маленькая посуда

Стоит обратить внимание на большее количество галантереи, каждая статья - это вкус первой любви, гвоздь~

  • parseObject(String text)

Выше это то, чтоСериализация, то соответствующийдесериализовать

Десериализация предназначена для преобразования строк в формате JSON в объекты Java Bean.

Использование очень простое, вы можете преобразовать стандартныйСтрока JSONпревратиться вОбъект JSONObject,из-закласс JSONObjectДостигнутоИнтерфейс карты, так что мы можем пройтиget()чтобы получить значение.

мы уже знаемMapфатально неадекватна, поэтому мы предпочли бы получитьJavaBeanобъект.

Конечно, также возможно! Мы прошли по типу объекта, который мы хотим преобразовать, вы можете получить то, что мы хотимJavaBean

КромеБазовая десериализацияКроме того, есть ещеОбщая десериализациядоступный

пройти черезДженерики, мы можем избежать передачиОбъект класса, и напрямую получить нашJavaBean

FastJSONЕще одним преимуществом сериализации является то, чтоглубокий клон. Друзья, прочитавшие мои предыдущие статьи, считают, что имеют определенное представление о шаблонах проектирования программного обеспечения, среди которых原型模式Вовлеченныйглубокий клона такжеМелкий клон.

Реализация мелкого клона очень проста, нам нужно только реализоватьCloneableинтерфейс, затем переопределитьclone()Метод:

Как мы видим в результатахво френдзонепринадлежать小王да этоМелкий клониз недостатков. мы хотим достичьглубокий клонЕсть много способов:

  • Вручную присвойте значения ссылочным свойствам
  • с помощьюFastJSON
  • использоватьJava-потоксериализованный объект

Способов много, остановимся на следующихFastJSONреализация:

пройти черезFastJSONДесериализация двух получаемых нами объектов на самом деле отличается, что тоже очень удобно реализоватьглубокий клон.

Для большего понимания шаблонов проектирования, пожалуйста, переместите:

В 2021 году не так много режимов творчества, которые нужно изучить, создайте объект!

Войдя в «Структурный режим» с картинками и текстами, оказывается, что это так просто!

Стучите по доске! Поведенческий режим приближается

parseArray(String text)

это воляСтрока JSONПеревести вJSONArrayМетоды

Точно так же мы можем также использоватьОбщая сериализациядля достижения той же функции:

В этом методе есть яма: мы используемparseArray()Когда используется этот метод, второй параметр должен передавать тип объекта, который мы хотим десериализовать, но здесь нам нужно передать массив Я не знаю, поместили ли вы в массив два одинаковых объекта.typeчувствуешь себя странно? Да, это яма этого метода, мыListсколько объектов,Type[]Число в этом массиве должно совпадать, иначе будет выдана следующая ошибка:

Но еслиListМы можем использовать этот метод, когда есть несколько объектов разных типов:

toJSONBytes(Object o)

БудуJSONобъект, преобразованный вByte(байтовый) массив

Когда мы обычно ведем сетевое общение, нам нужно преобразовать объекты в байты, а затем передать их. Когда мы используем строки, мы не можем не думать, что есть очень удобныйAPIПреобразование строки в массив байтов

String str = "小菜";
byte[] bytes = str.getBytes();

Но если мы хотимJavaBeanКогда объект преобразуется в массив байтов, мы должны использоватьByteArrayOutputStreamСправка по трансляции:

Этот способ также может быть очень хорошимJavaBeanОбъект преобразуется в байтовый массив, но кода многовато! а такжеFastJSONтакже обеспечивает очень удобныйAPIиспользовать:

И мы хотим преобразовать массив байтов в объект,FastJSONТакже поддержка:

отparseObject()В этом методе мы видим еще один странный параметрFeature, мы нажимаем на исходный код, чтобы обнаружить, что на самом деле это класс перечисления:

Глядя на то же облачно и туманно, так много экземпляров объектов, мы сделали комментарии к наиболее часто используемым ниже:

объект описывать
AllowUnQuotedFieldNames Определяет, будет ли синтаксический анализатор разрешать имена атрибутов без двойных кавычек.
AllowSingleQuotes Определяет, разрешает ли синтаксический анализатор заключать имена атрибутов и строковые значения в одинарные кавычки.
InternFieldNames Определяет, могут ли имена свойств объекта JSON быть канонизированы с помощью String#intern. Если разрешено, все имена свойств в JSON будут intern() , если не задано, нормализоваться не будет. По умолчанию это свойство открыто.
AllowISO8601DateFormat Если установлено значение true, при обнаружении даты со строкой, соответствующей формату ISO8601, она будет напрямую преобразована в класс даты.
AllowArbitraryCommas Допускается использование нескольких запятых. Если установлено значение true, несколько запятых будут пропущены напрямую.
UseBigDecimal Установите значение true, чтобы использовать класс BigDecimal для загрузки чисел, в противном случае используйте double
IgnoreNotMatch игнорировать несоответствие
DisableCircularReferenceDetect Отключить обнаружение циклических ссылок
InitStringFieldAsEmpty Для свойства строки без значения установлено значение пустой строки
SupportArrayToBean Поддержка массива для объекта
OrderedField Свойства сохраняют свой первоначальный порядок
DisableSpecialKeyDetect Отключить проверку специальных символов
UseObjectArray Используйте массив объектов
writeJSONString(OutputStream os, Object o)

Этот метод записывает объект в выходной поток:

Входящий параметр также может бытьWriterОбъект:

Выше это то, что мы обычно используемAPI, в дополнение кFastJSONТакже есть примечание в@JSONFieldМы также должны научиться быть гибкими

@JSONField
переименование

Примечание:Если атрибут私有да, должно бытьset()метод, иначе он не может быть десериализован!

@JSONFieldПрост в использовании и может быть настроен вgetter(),setter()илиполе свойстваначальство

Результаты теста:

Самое большое преимущество этого метода в том, что он используется для подключения странных документов. Почему это странно? Иногда нам нужно вызвать сторонний интерфейс, но значение, возвращаемое этим интерфейсом, может не соответствовать соглашению об именах. чтобы определить класс сущности для его получения (карта в порядке, но не стандартизирована).

В настоящее время имя атрибута определяемого нами класса сущностей должно быть названо в соответствии с именем возвращаемого поля, что является смертельным ударом для обсессивно-компульсивного программиста.@JSONFieldА вот и полезность, давайте просто посмотрим на пример. Поле возврата информационного объекта номерного знака выглядит следующим образом:

{"PLATEID" : 01, "PLATE": '闽A6666D', "IMAGEURL":'http://...'}

Мы видим, что возвращаемые имена полей не удовлетворяют правилу малого верблюжьего случая, и определяемый нами класс сущностей не может этого сделать.@JSONFieldзаписывается следующим образом:

Проверьте, может ли результат быть успешно получен:

Видно, что мы успешно получили результат, и наименование класса сущности также соответствует нашим спецификациям, убивая двух зайцев одним выстрелом.

DataFormat

Мы также можем использовать эту аннотацию для форматирования нашей даты так, как мы хотим.

сериализация управления

При сериализации или десериализации мы можем указать, что поле не сериализовано, что немного похоже наJava-потокисерединаtransientретушь.FastJSONПодобный функционал также может быть реализован в:

Но один недостаток десериализации заключается в том, что хотя значение пусто, имя атрибута все еще там~

ordinal

мы можем использоватьordinalуказать порядок полей

Вы можете увидеть, получив результатполе свойстваУпорядочив в указанном нами порядке, полезность может заключаться в том, что, когда мы возвращаем слишком много полей во внешний интерфейс, мы можем отдать приоритет полезным полям на передний план, чтобы мы могли получить лучшие значения, вместо того, чтобы искать слой требуемых полей с помощью слой.

пользовательская сериализация

Все можно настроить, сериализация не исключение ~ Мы можем использоватьserializeUsingУкажите класс сериализации для свойств

Таким образом мы ориентируемсяageЭто свойство обрабатывается для добавления единиц измерения в указанное поле.

Это приноситFastJSONИспользование, я надеюсь привести модераторов к вашим друзьям, дорога длинная, и Сяокай будет искать ее вместе с вами~

看完不赞,都是坏蛋

Сегодня вы работали усерднее, вы можете попросить меньше, чем завтра!

Я Сяо Кай, мужчина, который изучает с тобой. 💋

Официальный аккаунт WeChat открыт,Хорошая еда, студенты, которые не обратили внимания, не забудьте обратить внимание!

Каждая статья — это вкус первой любви~